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)
quelle