Leitfaden zum Prozess für das Cleanup inaktiver Datensätze

Beim Cleanup inaktiver Datensätze handelt es sich um einen Singlethread-Hintergrundprozess, durch den zur Löschung gekennzeichnete Datensätze von Seiten gelöscht werden. Der folgende Artikel bietet einen Überblick über diesen Prozess.

Inaktive Datensätze

Datensätze, die auf der Blattebene einer Indexseite gelöscht werden, werden nicht von der Seite entfernt. Stattdessen werden die Datensätze mit „Zu löschen“ gekennzeichnet oder verwaist. Dies bedeutet, dass die Zeile weiterhin auf der Seite angezeigt wird. Jedoch wird in der Zeilenüberschrift eine geringfügige Änderung vorgenommen, die anzeigt, dass die Zeile verwaist ist. Dies soll zu einer Optimierung der Leistung während eines Löschvorgangs beitragen. Verwaiste Elemente sind für Sperren auf Zeilenebene, aber auch für Momentaufnahmeisolationen erforderlich, bei denen die älteren Zeilenversionen verwaltet werden müssen.

Task für das Cleanup inaktiver Datensätze

Zum Löschen gekennzeichnete oder verwaiste Datensätze werden durch den Hintergrundprozess für das Cleanup inaktiver Datensätze bereinigt. Dieser Hintergrundprozess wird manchmal ausgeführt, nachdem die Löschtransaktion zugesichert wurde. Durch ihn werden verwaiste Datensätze von Seiten entfernt. Der Prozess für das Cleanup inaktiver Datensätze wird automatisch in regelmäßigen Zeitabständen ausgeführt (bei SQL Server 2012+ alle 5 Sekunden, bei SQL Server 2008/2008R2 alle 10 Sekunden) und prüft, ob alle Seiten, auf denen sich inaktive Datensätze befinden, entsprechend gekennzeichnet wurden. Findet der Prozess inaktive Datensätze, werden diese zur Löschung gekennzeichneten Datensätze gelöscht oder verwaist. Bei jeder Ausführung sind höchstens 10 Seiten betroffen.

Wenn ein Datensatz verwaist ist, wird die Datenbank entsprechend gekennzeichnet. Der Prozess für das Cleanup inaktiver Datensätze überprüft dann nur diese Datenbanken. Sobald sämtliche verwaisten Datensätze gelöscht wurden, kennzeichnet der Prozess für das Cleanup inaktiver Datensätze die Datenbank mit „having no ghosted records“ (enthält keine verwaisten Datensätze) und überspringt diese Datenbank bei der nächsten Ausführung. Darüber hinaus überspringt der Prozess Datenbanken, in denen er keine gemeinsame Sperre übernehmen kann, und wiederholt diesen Vorgang bei der nächsten Ausführung.

Mit der nachfolgenden Abfrage kann ermittelt werden, wie viele verwaiste Datensätze in einer einzelnen Datenbank enthalten 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 des Cleanups inaktiver Datensätze

Auf Systemen mit hoher Belastung, auf denen viele Löschvorgänge durchgeführt werden, kann der Prozess für das Cleanup inaktiver Datensätze zu Leistungsproblemen bei der Beibehaltung von Seiten im Pufferpool und bei der E/A-Generierung führen. Folglich kann dieser Prozess mit dem Ablaufverfolgungsflag 661 deaktiviert werden. Eine Deaktivierung des Prozesses kann jedoch zu einer Beeinträchtigung der Leistung führen.

Durch das Deaktivieren des Prozesses für das Cleanup inaktiver Datensätze kann Ihre Datenbank unnötig groß werden. Dies kann zu Leistungsproblemen führen. Da durch das Cleanup als inaktiv gekennzeichnete Datensätze entfernt werden, bleiben diese Datensätze auf der Seite, wenn Sie den Prozess deaktivieren. Dadurch kann SQL Server diesen Speicherplatz nicht wiederverwenden. Folglich muss SQL Server stattdessen Daten zu neuen Seiten hinzufügen. Dies führt zu übermäßig großen Datenbankdateien und kann Seitenteilungen verursachen. Seitenteilungen wiederum führen bei der Erstellung von Ausführungsplänen und bei der Durchführung von Prüfvorgängen zu Leistungsproblemen.

Sobald der Prozess für das Cleanup inaktiver Datensätze deaktiviert wurde, müssen für die Entfernung der verwaisten Datensätze einige Maßnahmen ergriffen werden. Eine Möglichkeit besteht in einer Indexneuerstellung. Dabei werden Daten auf Seiten verschoben. Eine andere Möglichkeit besteht darin, sp_clean_db_free_space (für die Bereinigung sämtlicher Datenbank-Datendateien) oder sp_clean_db_file_free_space (für die Bereinigung einzelner Datenbank-Datendateien) manuell auszuführen. Dadurch werden verwaiste Datensätze gelöscht.

Warnung

Generell wird von einer Deaktivierung des Prozesses für das Cleanup inaktiver Datensätze abgeraten. Sollten Sie dennoch eine Deaktivierung in Erwägung ziehen, prüfen Sie dies gründlich in einer kontrollierten Umgebung, bevor Sie sie dauerhaft in einer Produktionsumgebung implementieren.

Nächste Schritte

Deaktivieren des Prozesses für die Bereinigung inaktiver Datensätze
Entfernen inaktiver Datensätze aus einer einzelnen Datenbankdatei
Entfernen inaktiver Datensätze aus sämtlichen Datenbankdateien