Geisterbereinigung

7

Mein Verständnis des Ghost-Bereinigungsprozesses ist, dass alle fünf Sekunden gespenstische Datensätze in einem Index entfernt werden. Damit das System nicht überlastet wird, werden nur etwa zehn Seiten gleichzeitig "bereinigt".

Das heißt also, dass alle fünf Sekunden nur Datensätze im Wert von ca. 80.000 bereinigt werden? Anscheinend sind meine Indizes immer mit gespenstischen Datensätzen gefüllt und die Bereinigung würde niemals abgeschlossen sein.

Nehmen wir also an, ich führe einen Löschvorgang durch, vielleicht eine Million Zeilen, und die Indexdatensätze für diese Millionen Zeilen sind ungefähr 8 GB groß. also ungefähr 100.000 mal die Differenz von 80k. Bedeutet das, dass die Geisterbereinigung 500.000 Sekunden oder fast sechs Tage dauern wird?

klar, ich vermisse hier etwas, weil es keinen Sinn macht, dass es so lange dauern würde, die gespenstischen Aufzeichnungen zu löschen. und was ist mit der anderen Aktivität, die denselben Index erreicht? Verursacht der Ghost-Bereinigungsprozess Wartezeiten oder muss auf andere Prozesse gewartet werden?

[Diese Frage wurde durch Leistungsprobleme verursacht, die wir im OpsMgrDW gesehen haben, und wir wollten mehr über diesen Prozess erfahren.]

SQLRockstar
quelle

Antworten:

4

Ich habe zwei umfassende Blog-Beiträge geschrieben, in denen die Bereinigung von Geistern erklärt wird (dies ist der einzige Ort, an dem es irgendwo ausführlich erklärt wird, entweder in gedruckter Form oder online).

Der erste ist Inside the Storage Engine: Ghost-Bereinigung in der Tiefe und der zweite ist Ghost Cleanup Redux . Ja, jedes Mal 10 Seiten, und es ist möglich, dass die Geisterbereinigungsaufgabe niemals ein hohes Volumen an fortlaufenden Löschvorgängen einholt.

Abgesehen von den 10 Seiten alle 5 Sekunden kann die Geisterbereinigung aggressiv ausgelöst werden, indem sichergestellt wird, dass die Storage Engine die Geisteraufzeichnungen "sieht". Erzwingen Sie einen Scan der betroffenen Tabelle oder des betroffenen Index mit etwas wie

Wählen Sie * aus [Problemtabelle] mit (Index = Problemindex)

Dadurch wird eine Anforderung in die Warteschlange gestellt, um die Geisteraufzeichnungen aggressiv zu bereinigen. Beachten Sie jedoch, dass dabei viel Transaktionsprotokoll generiert wird. Sie sollten auch durch Index-Neuerstellungen oder Reorganisationen im Rahmen der regelmäßigen Indexpflege gelöscht werden.

Hoffe das hilft.

Paul Randal
quelle
2

Ich habe immer gedacht, dass Index-Neuerstellungen alle verbleibenden Probleme "beheben" würden, wenn die Strukturen verschoben werden.

gbn
quelle
2

Vor ein paar Jahren bin ich auf dieses Problem gestoßen und konnte es nicht durch Konfiguration, Auslösen einer Geisterbereinigung oder ähnliches beheben. Ich habe mit einer Datenbank gearbeitet, die kontinuierlich Einfügungen und Löschungen aufwies, und SQLServer wurde aufgrund der Auslösung der Geisterbereinigung regelmäßig gesperrt.

Meine mögliche Lösung bestand darin, die Problemtabellen nach Zeit zu partitionieren, und anstatt alte Zeilen zu löschen, konnte ich lediglich die alten Tabellen löschen. Das hat immens geholfen. Dies ist für Ihre Situation möglicherweise nicht möglich, gilt jedoch mit einigen Abweichungen für viele.

dwc
quelle
das ist interessant. OpsMgr versucht ebenfalls, Tabellen zu löschen, aber es kommt regelmäßig zu Konflikten mit der Geisterbereinigung.
SQLRockstar
Yup - Partitionierung ist (theoretisch) immer eine bessere Lösung als massives Löschen, aber normalerweise gibt es einen Grund, warum sie nicht implementiert werden kann. Die meisten Tools von Drittanbietern unterstützen dies nicht, da dies die Abfrageeigenschaften der Arbeitslast ändern und zu Blockierungsproblemen führen kann.
Paul Randal
2

Wir haben eine ähnliche Situation. Eine unserer Tabellen enthält viele Ghost-Datensätze, und diese Datensätze werden nicht durch den Ghost-Bereinigungsprozess bereinigt. DB Shrinking, DBCC Cleantable, Neuerstellung des Index und Reorganisation des Index haben keine Verwendung. Um dies zu beheben, übertragen wir Daten in eine temporäre Tabelle, übertragen dann die Tabelle und übertragen Daten zurück in eine abgeschnittene Tabelle. Diese Tabelle enthält LOB-Daten (2 nvarchar (max) Spalten). Gibt es eine andere Möglichkeit, dies zu beheben?

RAM
quelle