Ich habe mehrere Tabellen mit einer Zeilenanzahl zwischen 5 und 1,5 GB
Jede Tabelle hat ein BLOB-Feld, dessen Größe von 100 Byte bis 30 MByte variiert und das als 'große Werttypen außerhalb der Zeile' = ON gespeichert wird
Tabellen werden in verschiedenen Dateigruppen mit jeweils 3-4 Dateien auf unterschiedlichen Platten @ unterschiedlichen LUNs @ sehr schnellem SAN gespeichert
Täglich wachsen diese Tabellen mit einer Größe von 5 bis 100 GB und 600.000 bis 1,5 Millionen Zeilen
Nach einer bestimmten Zeitspanne , die zwischen 2 Wochen und 6 Monaten liegt, werden einige der Zeilen gelöscht oder in die Archiv-DB verschoben. In Arbeitstabellen, die älter als 6 Monate sind, sind also keine Zeilen mehr vorhanden.
Aktuelle Konfiguration des Servers:
- Das SQL Server-Modul ist 2008 R2 SP1 Enterprise mit 24 Kernen und 64 GB RAM
- SQL Server wird mit zusätzlichen Startflags ausgeführt:
-T 3640; (Beseitigt das Senden von DONE_IN_PROC-Nachrichten an den Client für jede Anweisung in einer gespeicherten Prozedur. Dies ähnelt der Sitzungseinstellung von SET NOCOUNT ON, aber wenn es als Ablaufverfolgungsflag festgelegt ist, wird jede Clientsitzung auf diese Weise behandelt.)
-T 1118; (Ändert die Zuordnungen in tempDB von jeweils 1 pg (für die ersten 8 Seiten) in einem bestimmten Umfang.)
-T 2301; (Ermöglicht erweiterte Optimierungen, die für Entscheidungsunterstützungsabfragen spezifisch sind. Diese Option gilt für die Entscheidungsunterstützungsverarbeitung großer Datenmengen.)
-T 1117; (Vergrößert alle Datendateien auf einmal, ansonsten wechselt es ab.)
-E; (Erhöht die Anzahl der Speicherbereiche, die jeder Datei in einer Dateigruppe zugewiesen werden. Diese Option kann für Data Warehouse-Anwendungen hilfreich sein, bei denen eine begrenzte Anzahl von Benutzern Index- oder Datenscans ausführt.)
-T 834; (Veranlasst SQL Server, Windows-Zuordnungen für große Seiten für den für den Pufferpool zugewiesenen Speicher zu verwenden: http://msdn2.microsoft.com/en-us/library/aa366720.aspx , http://support.microsoft. com / kb / 920093 )
- SQL Server verwendet große Seitenerweiterungen
- SQL Server verwendet die Option zur schnellen Dateiinitialisierung
- AUTOSHRINK ist für alle Datenbanken deaktiviert
Das Problem ist, dass ab einem bestimmten Zeitpunkt der Server-Betriebszeit (von ein paar Tagen bis zu Monaten) GHOST CLEANUP
keine erzwungenen Bereinigungen durchgeführt werden müssen, sondern lediglich die üblichen Aufgaben ausgeführt werden müssen. Dies which is seen thru Extended Events
ist nicht geeignet , da mehrere Seiten in mehreren Sekunden bereinigt werden müssen ( ) Es ist nicht möglich, alle gelöschten Zeilen zu bereinigen
Das Problem besteht seit den Zeiten von SQL Server 2005 RTM Enterprise
Wie ich versucht habe, das Problem zu lösen:
- Versucht, SCAN-Vorgänge für Clustered-Indizes der Tabellen zu erzwingen
- Versucht, SCAN-Vorgänge zu erzwingen, die den gesamten Inhalt der BLOB-Spalte in Clustered-Indizes der Tabellen einbeziehen
- system sp_clean_db_free_space & sp_clean_db_file_free_space
- Manuelles Dbcc-Cleanpage (@dbid, @fileid, @page) für alle Dateien und Seiten in der Datenbank
- Clustered-Index wird neu erstellt und organisiert
- Datenbank neu erstellen
DBCC FORCEGHOSTCLEANUP
Wenn ich die Abfrage starte:
select * from sys.dm_db_index_physical_stats(db_id(), object_id('ProblemTable'), 1, 0, 'detailed')
Ich sehe Millionen und Dutzende von Millionen Geisterdatensätzen, aber nur für den Zuordnungseinheitentyp von LOB_DATA
Die einzigen Dinge, die helfen:
- Stoppen des Servers mit dem Befehl SHUTDOWN oder Neustarten des gesamten Hosts - dies hilft, wenn nach dem Neustart der Prozess GHOST CLEANUP einige Stunden lang ausgeführt wird und alle Geisteraufzeichnungen tatsächlich bereinigt werden
- DBCC SHRINKFILE mit EMPTYFILE-Option - Durch das Verschieben aller Daten von einer Datei in eine andere oder neu erstellte Datei werden nur Geisterdatensätze in dieser Datei bereinigt. Das Problem ist, dass ich Verkleinerungsoperationen wirklich hasse. Und das dauert 3-4 Tage für EINE Datei
Die Frage ist, ob es eine programmatische (vorzuziehende) oder wartungsbedingte Möglichkeit gibt, GHOST CLEANUP überhaupt ohne Serverausfall zu erzwingen, da Serverausfallzeiten zu viel kosten, auch wenn sie nicht akzeptabel sind. Sie liegen zwischen Tausenden und Zehntausenden US-Dollar pro Stunde
Probleme wurden gleichermaßen bemerkt, meine sind hier:
- http://support.microsoft.com/kb/932115
- http://www.sqlservercentral.com/Forums/Topic496244-149-1.aspx
Und genau das ist hier: