Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Der Ghost Cleanup-Prozess ist ein Einthread-Hintergrundprozess, der Datensätze von Seiten löscht, die zum Löschen markiert wurden. Der folgende Artikel enthält eine Übersicht über diesen Prozess.
Ghost-Aufzeichnungen
Datensätze, die aus einer Blattebene einer Indexseite gelöscht werden, werden nicht physisch von der Seite entfernt . Stattdessen wird der Datensatz als "gelöscht" oder "gespenst" markiert. Dies bedeutet, dass die Zeile auf der Seite bleibt, aber etwas in der Zeilenüberschrift geändert wird, um anzugeben, dass es sich wirklich um eine Geisterzeile handelt. Dies soll zu einer Optimierung der Leistung während eines Löschvorgangs beitragen. Geister sind für die Sperrung auf Zeilenebene erforderlich, sind aber auch für die Momentaufnahmeisolation erforderlich, bei der wir die älteren Versionen von Zeilen beibehalten müssen.
Ghost Record-Bereinigungsaufgabe
Datensätze, die zum Löschen oder als verwaist gekennzeichnet sind, werden durch den Hintergrundprozess zur Bereinigung von Geisterdatensätzen bereinigt. Dieser Hintergrundprozess wird nach einiger Zeit ausgeführt, nachdem die Löschtransaktion zugesichert wurde, und entfernt Geisterdatensätze physisch von Seiten. Der Ghost-Bereinigungsprozess wird automatisch in einem Intervall (alle 5 Sekunden für SQL Server 2012+, alle 10 Sekunden für SQL Server 2008/2008R2) ausgeführt und überprüft, ob Seiten mit Geistereinträgen markiert wurden. Wenn welche gefunden werden, werden die Datensätze, die für das Löschen markiert sind oder als temporär zur Löschung vorgemerkt sind, wobei bei jeder Ausführung höchstens 10 Seiten berührt werden.
Wenn ein Datensatz als Geistereintrag markiert wird, wird die Datenbank als eine mit Geistereinträgen markierte Datenbank geführt, und der Geisterbereinigungsprozess überprüft nur diese Datenbanken. Der Gespensterbereinigungsprozess markiert die Datenbank auch als "Keine gespensten Datensätze", nachdem alle gespensteten Datensätze gelöscht wurden, und diese Datenbank wird bei der nächsten Ausführung übersprungen. Der Vorgang überspringt auch alle Datenbanken, für die keine freigegebene Sperre verwendet werden kann, und versucht es erneut, wenn sie das nächste Mal ausgeführt wird.
Die folgende Abfrage kann ermitteln, wie viele verwaiste Datensätze in einer einzelnen Datenbank vorhanden sind.
SELECT sum(ghost_record_count) total_ghost_records, db_name(database_id)
FROM sys.dm_db_index_physical_stats (NULL, NULL, NULL, NULL, 'SAMPLED')
group by database_id
order by total_ghost_records desc
Deaktivieren der Geisterbereinigung
Der Geisterbereinigungsprozess kann bei Systemen mit hoher Auslastung und vielen Löschvorgängen zu einem Leistungsproblem führen, indem Seiten im Pufferpool beibehalten und E/A generiert werden. Daher ist es möglich, diesen Prozess mit der Verwendung des Traceflags 661 zu deaktivieren. Es gibt jedoch Leistungsauswirkungen beim Deaktivieren des Prozesses.
Das Deaktivieren des Ghost Cleanup-Prozesses kann dazu führen, dass ihre Datenbank unnötig groß wird und zu Leistungsproblemen führen kann. Da der Ghost-Bereinigungsprozess Datensätze entfernt, die als Geister gekennzeichnet sind, belässt das Deaktivieren des Prozesses diese Datensätze auf der Seite, sodass SQL Server diesen Speicherplatz nicht wiederverwenden kann. Dies zwingt SQL Server dazu, Daten zu neuen Seiten hinzuzufügen, was zu aufgeblähten Datenbankdateien führt und auch Seitenaufteilungen verursachen kann. Seitenaufteilungen führen zu Leistungsproblemen beim Erstellen von Ausführungsplänen und zum Ausführen von Scanvorgängen.
Sobald der Gespensterbereinigungsprozess deaktiviert ist, müssen einige Maßnahmen ergriffen werden, um die gespensierten Datensätze zu entfernen. Eine Option besteht darin, eine Indexneuerstellung auszuführen, wodurch Daten auf Seiten verschoben werden. Eine weitere Option besteht darin, sp_clean_db_free_space manuell auszuführen (um alle Datenbankdatendateien zu bereinigen) oder sp_clean_db_file_free_space (um eine einzelne Datenbankdatendatei zu bereinigen), wodurch gespensierte Datensätze gelöscht werden.
Warnung
Das Deaktivieren des Ghost Cleanup-Prozesses wird im Allgemeinen nicht empfohlen. Dies sollte in einer kontrollierten Umgebung gründlich getestet werden, bevor sie dauerhaft in einer Produktionsumgebung implementiert wird.