Was tun nach dem Löschen einer Million Datensätze?

7

Wir implementieren eine neue Funktion in unser System, mit der smallintjede Nacht etwa eine Million Datensätze (jeder Datensatz ist winzig, im Grunde eine GUID, ein Datum und vier Felder) aus einer Tabelle gelöscht werden. Im Grunde ist es eine Caching-Tabelle, und sobald die Daten 7 Tage alt sind, tun wir Folgendes:

DELETE FROM scheduleCache WHERE schDateCreated < '2013-08-26

Dies wird jede Nacht um 1 Uhr morgens ausgeführt und jedes Mal, wenn es ausgeführt wird, werden etwa eine Million Datensätze gelöscht.

Gibt es etwas, das ich für einen Tisch wie diesen notieren oder tun sollte? Gibt es Eigenschaften, die ich auf den Tisch legen sollte, oder Routinen, die ich regelmäßig ausführen sollte, um "aufzuräumen"? Ich habe mich noch nie mit einem solchen Tisch befasst.

Die Tabelle hat einen einzelnen Clustered-Index (GUID + eines der smallintFelder), und wir haben eine wöchentliche Indexwiederherstellung, die am Sonntagmorgen ausgeführt wird.

Mark Henderson
quelle

Antworten:

7

Das Problem des Löschens großer Teile einer Tabelle ist alles andere als ein triviales Problem. Der mit Abstand beste Ansatz ist die Partitionierung. Ein tägliches Partitionsschema mit einem Schiebefenster ist wirklich ein Wundermittel für dieses Problem. Weitere Informationen finden Sie unter Implementieren eines automatischen Schiebefensters in einer partitionierten Tabelle .

Wenn Sie sich keine Partitionierung leisten können (z. B. eine Nicht-Unternehmenslizenz vor Ort), würde ich das Clustering nach empfehlen schDateCreated. Wenn Sie einen Primärschlüssel für die GUID + smallint benötigen, verschieben Sie ihn in einen nicht gruppierten Schlüssel. In Chargen (z. B. TOP 10000) in einer Schleife löschen, um den Druck auf das Protokoll zu verringern. Erwägen Sie, die Statistiken nach dem Vorgang zu aktualisieren.

Remus Rusanu
quelle
Leider können wir uns weder eine Partitionierung leisten, noch können wir unsere Kundeninstallationen auffordern, ein Upgrade dieser Größe zu zahlen, damit diese Funktion reibungslos funktioniert. Ich werde es mit dem Clustered-Index beginnen, wie Sie vorschlagen, und sehen, wie wir von dort aus vorgehen.
Mark Henderson
Genau wie bei der Nachverfolgung habe ich einen Clustered-Index für das Datumsfeld erstellt, einen erstellt DELETE TOP 10000 WHILE COUNT() > 0und es funktioniert seit mehreren Monaten hervorragend.
Mark Henderson
4

Eine Lösung wäre, die Daten in einer Tabelle pro Tag zu speichern und die Tabellen zu löschen, wenn sie aus dem Cache altern. Die Tabellen hätten Namen wie cache_ (julian date).

Eine andere Lösung wäre, eine Reihe von Tabellen cache_0 bis cache_n zu haben, wobei jede Tabelle abgeschnitten wird, bevor Sie sie verwenden. Sie würden für jeden Tag den Tabellencache _ ((julianisches Datum) modulo (Zykluszeitraum)) verwenden.

Sie müssten das Jahresende sorgfältig behandeln, da Sie für beide Lösungen entweder von 365 oder 366 auf 0 wechseln.


quelle
Tatsächlich sollten diese beiden Dinge funktionieren, aber Ich mag würde, die mehrere Tabellen für einen) Ausführungsplan Caching und b zu vermeiden) Ich weiß , dass einige Kunden geben nicht die Anwendung create tableErlaubnis
Mark Henderson