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.
Ghost Cleanup ist ein Hintergrundprozess, der die Zeilen, die durch DML-Anweisungen zum Löschen markiert wurden, physisch entfernt. Der folgende Artikel enthält eine Übersicht über diesen Prozess.
Geisterzeilen
Zeilen, die aus den Blattebenenseiten eines Indexes gelöscht werden, werden nicht physisch von der Seite entfernt. Stattdessen wird die Zeile für zukünftige Entfernung oder zur Ausblendung markiert. Dies bedeutet, dass die Zeile auf der Seite bleibt, aber eine Kleinigkeit in der Zeilenüberschrift geändert wird, um anzugeben, dass die Zeile als Geisterzeile markiert ist. Dies soll zu einer Optimierung der Leistung während eines Löschvorgangs beitragen. Ghosts sind für das Sperren auf Zeilenebene und für Snapshotisolationstransaktionen erforderlich, bei denen das Datenbankmodul ältere Zeilenversionen verwalten muss.
"Ghost Cleanup"-Aufgabe
Zeilen, die zum Löschen oder als gelöscht markiert sind, werden vom Hintergrundbereinigungsprozess bereinigt, wenn sie nicht mehr benötigt werden. Ghost Cleanup wird in regelmäßigen Abständen ausgeführt und überprüft, ob Seiten über gelöschte Zeilen verfügen. Wenn sie einen Solchen findet, werden diese Zeilen physisch entfernt. Es gibt einen einzigen Ghost-Bereinigungsthread für alle Datenbanken in einer Datenbankmodulinstanz.
Wenn eine Zeile zu einem Geistereintrag wird, weist die Datenbank Geistereinträge auf. Der Ghost Cleanup-Prozess scannt nur solche Datenbanken. Der Gespensterbereinigungsprozess markiert die Datenbank auch als frei von geisterhaften Zeilen, sobald alle geisterhaften Zeilen entfernt wurden, und überspringt diese Datenbank bei der nächsten Ausführung des Prozesses. Der Vorgang überspringt auch eine Datenbank, wenn er keine geteilte Sperre für die Datenbank erhalten kann. Beim nächsten Ausführen der Datenbank wird die Sperrerfassung erneut ausgeführt.
Die folgende Abfrage gibt eine ungefähre Anzahl markierter Zeilen in einer Datenbank zurück.
SELECT SUM(ghost_record_count) AS total_ghost_records,
DB_NAME(database_id) AS database_name
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
In Hochlastsystemen mit vielen Löschvorgängen kann der Ghost Cleanup-Prozess die Leistung verringern, wenn viele der häufig aufgerufenen Seiten im Pufferpool durch andere Seiten ersetzt werden, die über gespensierte Zeilen verfügen. Daher müssen die häufig aufgerufenen Seiten erneut vom Datenträger gelesen werden, was zusätzliche Datenträger-E/A-Vorgänge erzeugt und die Abfragelatenz erhöht. Wenn dies geschieht, können Sie die Ghost-Cleanup mit dem Trace-Flag 661 deaktivieren.
Ohne Ghost Cleanup kann Ihre Datenbank unnötig groß werden, was auch die Leistung aufgrund zusätzlicher E/A- und Arbeitsspeicherauslastung reduzieren kann. Da der Ghost-Bereinigungsprozess Zeilen entfernt, die als Geister gekennzeichnet sind, lässt das Deaktivieren des Vorgangs diese Zeilen auf der Seite zurück, sodass das Datenbankmodul diesen Speicherplatz nicht wiederverwenden kann. Dadurch wird das Datenbankmodul gezwungen, stattdessen Daten zu neuen Seiten hinzuzufügen, was zu aufgeblähten Datenbankdateien führt und auch Seitenunterbrechungen verursachen kann. Seitenaufteilungen erhöhen die Datenträger-E/A, wodurch die Abfrageleistung reduziert werden kann. Wenn die Gespenstbereinigung deaktiviert ist, hat die Datenbank möglicherweise nicht mehr Platz.
Warnung
Das dauerhafte Deaktivieren des Ghost Cleanup-Prozesses wird nicht empfohlen.
Um Geisterzeilen zu entfernen, wenn die Ghostbereinigung deaktiviert ist, erstellen Sie Indizes für Tabellen neu, in denen Zeilen gelöscht wurden. Durch das Neuerstellen eines Indexes werden neue Seiten aus vorhandenen Daten erstellt, wobei nicht mehr benötigte Zeilen im Prozess ignoriert werden.