Donnerstag, 3. Dezember 2009

SQL-Statements blockweise verarbeiten und somit Tablelocks verhindern

Wenn man mit großen Datenmengen arbeiten muss und Abfragen viel Last erzeugen oder sogar komplette Tabellen sperren, so kann man dieses umgehen indem man die Daten blockweise verarbeitet. Hierzu gibt es einen einfachen Trick.

1. SET ROWCOUNT 500
2. insert_more:
3. INSERT INTO dbo.TabelleZiel
4. SELECT * FROM [TestDB].[dbo].TabelleQuelle
5. WHERE ID NOT IN (SELECT ID FROM dbo.TabelleZiel)
6. AND ErstellDatum > '29.11.2009 00:00:00'
7. IF @@ROWCOUNT > 0 GOTO insert_more
8. SET ROWCOUNT 0

Mit dem Befehl RowCount legt man die pro Block zu verarbeitende Anzahl an Datensätzen fest.
Hier ist es wichtig einen geeigneten Wert zu finden. Sollte man die Blöcke zu groß einstellen, so wird doch wieder die komplette Tabelle gesperrt. 500 Datensätze ist hier schon ein gängiger Wert, welcher eigentlich immer verwendet werden kann.

Im Beispiel sieht man eine Goto-Schleife zwischen Zeile 2 und 7.
zwischen diesen Zeilen kann man dann das auszuführende Statement eintagen.
Das Beispiel zeigt ein umfangreicheres Insert. Hier könnte genauso gut ein einfaches Delete stehen.

Wichtig ist auch, dass nach der Verarbeitung die Blockverarbeitung wieder deaktiviert wird.
Dieses geschieht in Zeile 8. Der Wert 0 steht für eine unbegranzte Menge an Datensätzen.

Die Blockverarbeitung ist etwas langsamer als die direkte Komplettverarbeitung. Jedoch ist sie Ressourcen schonender und erzeugt keine Table-Locks.

Keine Kommentare:

Kommentar veröffentlichen