Performantes Löschen größerer Datenmengen mit DELETE

17/09/2007 - 18:48 von Jan Löhndorf | Report spam
Hallo Gruppe.

Ich habe ein Problem mit dem Löschen von größeren Datenmengen.

Hat da irgendjemand Erfahrung?

Ich habe eine Tabelle, die sich stàndig füllt (ca. 1000 Eintràge pro Std.)
Diese Tabelle hàlt Arbeitsdaten, die von anderen Prozessen regelmàßig
abgefragt werden. Diese Abfragen sind relativ zeitkritisch und sollen
nicht zu lange verzögert werden.
Nach ein paar Tagen werden diese Arbeitsdaten nicht mehr benötigt und
sollen wieder gelöscht werden.

Das geschieht regelmàßig nachts, da dann die Serverlast am geringsten ist.

Da die Abfrage nach den Löschkriterien relativ komplex ist, habe ich
schon eine weitere Tabelle angelegt, die die Keys (uniqueidentifier)
aller zu löschenden Zeilen enthàlt. Diese Tabelle fülle ich mit einem
SELECT mit der Option WITH (NOLOCK), damit Anfragen weiter durch kommen.

Danach lösche ich die Daten mit folgendem Statemant:
DELETE FROM WorkingData WHERE WorkingDataUId IN (SELECT WorkingDataUId
FROM DataToDelete)

TRUNCATE TABLE DataToDelete

Das Löschen der Daten dauert aber immer noch viel zu lange (>5 Minuten)
. Jede Anfrage, die zwischendurch anfàllt làuft auf einen Timeout.


Weiß irgendwer hier, wie man das professionell macht?

Gruß und Danke,
Jan
 

Lesen sie die antworten

#1 Olaf Pietsch
17/09/2007 - 20:39 | Warnen spam
Hallo Jan,

"Jan Löhndorf" schrieb im Newsbeitrag
news:fcmavr$q16$


Ich habe eine Tabelle, die sich stàndig füllt (ca. 1000 Eintràge pro Std.)
Diese Tabelle hàlt Arbeitsdaten, die von anderen Prozessen regelmàßig
abgefragt werden. Diese Abfragen sind relativ zeitkritisch und sollen



Mit welcher Transaktionsisolationsstufe werden diese Abfragen durchgeführt?
Würde DIRTY READ reichen, z. B. mit SET TRANSACTION ISOLATION LEVEL READ
UNCOMMITTED
bzw. als Tabellenhint im SELECT mit WITH (nolock).
http://msdn2.microsoft.com/en-us/li...73763.aspx
http://msdn2.microsoft.com/en-us/li...87373.aspx
Der Nachteil dieses Vorgehen liegt darin, das Zeilen gelesen werden können,
die nicht commited sind.

nicht zu lange verzögert werden.
Nach ein paar Tagen werden diese Arbeitsdaten nicht mehr benötigt und
sollen wieder gelöscht werden.

Das geschieht regelmàßig nachts, da dann die Serverlast am geringsten ist.

Da die Abfrage nach den Löschkriterien relativ komplex ist, habe ich schon
eine weitere Tabelle angelegt, die die Keys (uniqueidentifier) aller zu
löschenden Zeilen enthàlt. Diese Tabelle fülle ich mit einem SELECT mit
der Option WITH (NOLOCK), damit Anfragen weiter durch kommen.

Danach lösche ich die Daten mit folgendem Statemant:
DELETE FROM WorkingData WHERE WorkingDataUId IN (SELECT WorkingDataUId
FROM DataToDelete)



IN kann bei großen Datenmengen "langsam" werden. Ich würde es mit einen JOIN
bzw. einem EXISTS mal versuchen.
Sind Indexes so gesetzt, dass diese von den Abfragen genutzt werden, siehe
Auführungsplan im SSMS.

Dann könnte man die zu löschenden Daten in "Happen" löschen, z. B: mit einer
CUSOR Schleife.

Gruß Olaf
Ich unterstütze PASS Deutschland e.V. (http://www.sqlpass.de)
Regionalgruppe Köln/Bonn/Düsseldorf
(http://www.sqlpass.de/Regionalgrupp...fault.aspx)

Ähnliche fragen