Blog

Ghost Records im SQL Server - Ist denn schon Halloween?

Rainer
IT-Consultant

Aus aktuellem Anlass (Halloween steht vor der Tür) möchten wir auf ein potentielles Performance-Problem in SQL Server Datenbanken hinweisen: Ghost Records.

Nun, erst mal ganz entspannt bleiben. Das “Problem” wird sich in Ihrer Datenbank vermutlich nicht bemerkbar machen, es tritt nämlich erst dann auf, wenn es sich um eine wirklich große Datenbank handelt, in der sehr viele Löschoperationen stattfinden.

Worum geht’s bei den Ghost Records?

Werden Datensätze gelöscht, so werden diese aus Performancegründen zunächst nicht tatsächlich aus den Blattknoten entsprechender Indexseiten gelöscht, sondern lediglich als Löschkandidaten markiert. Diese Löschkandidaten oder verwaisten Einträge nennt Microsoft “Ghost Records”.

In einem Hintergrundprozess der alle fünf Sekunden läuft, eine unendlich lange Zeit für moderne Prozessoren, werden die so markierten Einträge dann tatsächlich entfernt. Diese Löschoperationen benötigen für ihre Arbeit Shared Locks. Der Hintergrundprozess behandelt hierbei je Aktivierung höchstens zehn Seiten, um die applikationsspezifischen Datenbankaktivitäten nicht zu behindern.

Kann ich die Anzahl der Ghost Records ermitteln?

Sofern Sie eine große Datenbank betreiben, in der sehr viele Löschoperationen stattfinden, möchten Sie jetzt sicher wissen, ob Sie die Anzahl dieser Ghost Records ermitteln können. Und Sie haben es sicher schon geahnt: Datenbanken führen über alles, was sie zur Bearbeitung ihrer Aufgaben benötigen Buch. In diesem Fall greifen Sie auf die benötigten Statistikwerte über die Systemfunktion sys.dm_db_index_physical_stats zu, die sich in der master-Datenbank befindet und folgende Parameter verwendet:

  1. DatabaseId
  2. ObjectId
  3. IndexId
  4. Partition
  5. Mode
SELECT db_name(database_id)
, sum(ghost_record_count) [Anzahl Ghost Records]
FROM sys.dm_db_index_physical_stats ( NULL -- DatabaseID
, NULL -- ObjectId
, NULL -- IndexId
, NULL -- Mode
, 'SAMPLED'
)
group by database_id
order by [Anzahl Ghost Records] desc

Hilfe! Was kann ich tun?

Sie haben über die o.a. Abfrage eine große Anzahl von Ghost Records ermittelt, was nun?

Zunächst einmal muss man sich fragen, was bedeutet eine große Anzahl. Man sollte die Anzahl gefundener Ghost Records immer im Verhältnis zur Größe der Datenbank sehen und bei einer 50 TB Datenbank sind 1.000.000 Ghost Records sicherlich eine sehr kleine Anzahl die nur einen geringen Prozentsatz der nicht verwaisten Daten ausmachen.

Im Normalfall regelt der Bereinigungsprozess alles für Sie, Sie müssen sich keine Sorgen machen und Microsoft schreibt zu diesem Thema:

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.

Sollten Sie dennoch der Meinung sein, dass die Performance durch die Arbeit des Bereinigungsprozess behindert wird und Sie hier eingreifen müssen, so können Sie den Bereinigungsprozess durch Setzen des Trace Flags 661 deaktivieren. Das hat jedoch folgende Auswirkung: Die Datenbank wächst durch die immer größer werdende Anzahl von Ghost Records, was auch zu einem Anwachsen der Index-Bäume führt und Sie müssen sich selbst über einen entsprechenden Job um die Bereinigung kümmern. Hier muss dann entweder vermehrt ein Index Rebuild ausgeführt werden oder die verwaisten Datensätze durch Aufruf einer der Stored Procedures sp_clean_db_free_space oder sp_clean_db_file_free_space freigegeben werden. Diese Aufrufe müssten dann natürlich jeweils zu Zeiten stattfinden, zu denen die Datenbankaktivitäten relativ niedrig sind, also beispielsweise nachts oder an Wochenenden.

Fazit

Das Thema Ghost Records ist sicherlich eher theoretischer Natur und hier nur wegen des bevorstehenden Halloween behandelt. Sie sollten den Cleanup Prozess ungestört seine Arbeit machen lassen. Sollten Sie aber den Eindruck haben, dass gerade Ihre Datenbank durch viele Lösch- und Bereinigungsoperationen in der Performance beeinträchtigt wird, dann testen Sie ausgiebig die Deaktivierung des Bereinigungsprozess und sorgen Sie für eine Alternative zu Zeiten geringer DB-Nutzung.

Wenn Sie mehr über dieses Thema erfahren möchten, stehen Ihnen unsere Expert:innen gerne zur Verfügung. Vereinbaren Sie gerne ein unverbindliches Beratungsgespräch über unser Kontaktformular.

Wir helfen Ihnen gerne weiter!

Interesse geweckt?
Vielen Dank! Wir haben Ihre Anfrage erhalten!
Oops! Beim Senden ist etwas schiefgegangen, versuche es erneut.