Ghost Cleanup-Einstellungen


10

Ich verwende eine Datenbank mit hohen Transaktionsraten (durchschnittlich ~ 175.000 Transaktionen / Minute, fast 9 Millionen Datensätze pro Stunde hinzugefügt und entfernt).

Bis vor kurzem war dies kein allzu großes Problem, da wir bei ~ 7,5 Millionen Datensätzen hinzugefügt und entfernt wurden, aber mit den neuesten Datenströmen scheint die Geisterbereinigung nicht in der Lage zu sein, mit der Bereinigung der Datensätze Schritt zu halten nicht verwendeter Speicherplatz in Tabellen / Indizes.

Vor ein paar Tagen haben wir 53 GB 'Ungenutzten Speicherplatz' in 16 Tabellen erreicht (meistens 2 davon). Daher haben wir uns mit der Geisterbereinigung befasst und festgestellt, dass sie alle 5 Sekunden ausgeführt wird und über 10 Seiten läuft.

Meine aktuelle Lösung ist, dass ich am frühen Morgen drei Threads mit dem folgenden Befehl ausführe:

DECLARE @2hours datetime = dateadd(hour,2,getutcdate())

WHILE getutcdate() < @2hours
BEGIN
    DBCC FORCEGHOSTCLEANUP ('DBNAME') WITH  NO_INFOMSGS
END

um den Rückstand aus der Nacht zuvor nachzuholen (wenn die meisten unserer Löschungen stattfinden)

Ich frage mich, ob es eine Möglichkeit gibt, die Standardeinstellungen von 5 Sekunden und 10 Seiten auf jede Sekunde zu ändern oder über 20 Seiten zu laufen. Gibt es eine Möglichkeit, dies zu tun, oder sollte ich weiterhin nur mehrere Bereinigungsprozesse starten, um das Problem zu beheben? Daten oder wenn es andere Aktionen gibt, die dabei helfen können

Die Neuindizierung wird für die meisten betroffenen Indizes mindestens einmal pro Woche durchgeführt (die meisten finden jeden zweiten Tag statt).

SQL Server 2012 Enterprise SP3_CU8 (morgen Upgrade auf CU9) auf AlwaysOn High Availabilty Cluster auch mit Replikation (Verteilung auf einem separaten Server)

Antworten:


4

Ich frage mich, ob es eine Möglichkeit gibt, die Standardeinstellungen von 5 Sekunden auf 10 Seiten pro Sekunde zu ändern oder über 20 Seiten zu laufen

Nein, es gibt keine. Zumindest weiß ich es noch nicht :-)

wenn es andere Aktionen gibt, die dabei helfen können

Aus Paul Randals Blog - Eine Methode, die manchmal in Betracht gezogen wird, besteht darin, die Geisterbereinigung zu erzwingen, um alles zu bereinigen, indem ein Tabellen- oder Index-Scan durchgeführt wird (wodurch alle gelöschten Datensätze für die Geisterbereinigungsaufgabe in die Warteschlange gestellt werden).

select * from [your_problem_table] with (index = Index_that_has_large_Deletes)

Gibt es eine Möglichkeit für Sie, die Tabelle zu partitionieren und die alte Partition zu löschen, anstatt Löschvorgänge durchzuführen ? Zu Ihrer Information: Mit SQL Server 2016 und höher können Sie auch einzelne Partitionen abschneiden.

Sie können auch (TEST und implementieren) - die Geisterbereinigung deaktivieren (Ablaufverfolgungsflag 661) und dann die rebuild index WITH ONLINE = ONOption deaktivieren, da Sie die Enterprise Edition verwenden.

Wenn Sie AlwaysON (mit Async) mit Replikation verwenden, stellen Sie sicher, dass das Trace-Flag 1448 aktiviert ist. Dadurch kann der Replikationsprotokollleser auch dann fortfahren , wenn die asynchronen sekundären Replikate den Empfang einer Änderung nicht bestätigt haben.

Lesen Sie unbedingt Löscht die geteilten Seiten und weitergeleiteten Geister von Paul White , um festzustellen, ob Ihre Tabellen Trigger oder LOB-Spalten enthalten, die sich verlangsamen würden.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.