Delen via


Handleiding voor het opschonen van spookbestanden

Het ghost-opschoonproces is een achtergrondproces met één thread waarmee records van pagina's worden verwijderd die zijn gemarkeerd voor verwijdering. In het volgende artikel vindt u een overzicht van dit proces.

Ghost records

Records die zijn verwijderd op bladniveau van een indexpagina, worden niet fysiek van de pagina verwijderd - in plaats daarvan worden de records gemarkeerd als 'te verwijderen' of ghosted. Dit betekent dat de rij op de pagina blijft, maar een beetje wordt veranderd in de koptekst van de rij om aan te geven dat de rij echt een spook is. Dit is om de prestaties tijdens een verwijderbewerking te optimaliseren. Ghosts zijn nodig voor vergrendeling op rijniveau, maar zijn ook nodig voor momentopname-isolatie waarbij we de oudere versies van rijen moeten onderhouden.

Taak voor het opschonen van spookrecords

Records die zijn gemarkeerd voor verwijdering of ghosted, worden opgeruimd door het achtergrondproces voor het opruimen van ghost-records. Dit achtergrondproces wordt een tijdje uitgevoerd nadat de verwijderingstransactie is doorgevoerd en verwijdert fysiek spookrecords van pagina's. Het ghost cleanup-proces wordt automatisch uitgevoerd op een interval (elke 5 seconden voor SQL Server 2012+, om de 10 seconden voor SQL Server 2008/2008R2) en controleert of er pagina's zijn gemarkeerd met ghostrecords. Als het iets vindt, verwijdert het de records die gemarkeerd zijn voor verwijdering, of ghosted, waarbij het bij elke uitvoering maximaal 10 pagina's aanraakt.

Wanneer een record wordt gespookt, wordt de database gemarkeerd als spookvermeldingen en scant het opschoningsproces alleen deze databases. Het proces voor het opruimen van verweesde gegevens markeert ook de database als 'geen verweesde records' zodra alle verweesde records zijn verwijderd, en deze database wordt overgeslagen wanneer het proces de volgende keer wordt uitgevoerd. Het proces slaat ook alle databases over die niet kunnen worden gebruikt om een gedeelde vergrendeling in te schakelen en probeert het opnieuw wanneer het de volgende keer wordt uitgevoerd.

Met de onderstaande query kunt u bepalen hoeveel ghosted records in één database bestaan.

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

Het uitschakelen van de ghost cleanup

Bij systemen met hoge belasting met veel verwijderingen kan het ghost-opschoonproces leiden tot een prestatieprobleem, doordat pagina's in de bufferpool blijven en I/O wordt gegenereerd. Als zodanig is het mogelijk om dit proces uit te schakelen met het gebruik van traceringsvlag 661. Er zijn echter gevolgen voor de prestaties van het uitschakelen van het proces.

Het uitschakelen van het ghost-opschoonproces kan ertoe leiden dat uw database onnodig groot wordt en kan leiden tot prestatieproblemen. Omdat het ghost cleanup-proces records verwijdert die zijn gemarkeerd als ghosts, laat het uitschakelen van het proces deze records op de pagina staan, waardoor SQL Server deze ruimte niet opnieuw kan gebruiken. Dit dwingt SQL Server om in plaats daarvan gegevens toe te voegen aan nieuwe pagina's, wat leidt tot opgeblazen databasebestanden en kan ook pagina-splitsingen veroorzaken. Paginasplitsingen leiden tot prestatieproblemen bij het maken van uitvoeringsplannen en bij het uitvoeren van scanbewerkingen.

Zodra het ghost-opschoonproces is uitgeschakeld, moet er actie worden ondernomen om de verweesde records te verwijderen. Een optie is om een index opnieuw op te bouwen, waarmee gegevens op pagina's worden verplaatst. Een andere optie is om handmatig sp_clean_db_free_space uit te voeren (om alle databasegegevensbestanden op te schonen) of sp_clean_db_file_free_space (om één databasegegevensbestand op te schonen), waardoor spookrecords worden verwijderd.

Waarschuwing

Het uitschakelen van het ghost-opschoonproces wordt over het algemeen niet aanbevolen. Dit moet grondig worden getest in een gecontroleerde omgeving voordat deze permanent in een productieomgeving wordt geïmplementeerd.