Delen via


Handleiding voor het opschonen van ghost

Ghost-cleanup is een achtergrondproces dat de rijen die door DML-instructies voor verwijdering zijn gemarkeerd, fysiek verwijdert. In het volgende artikel vindt u een overzicht van dit proces.

Spookrijen

Rijen die worden verwijderd uit de bladniveau pagina's van een index, verdwijnen niet fysiek van de pagina. In plaats daarvan wordt de rij gemarkeerd voor toekomstige verwijdering, ofwel ghosted. Dit betekent dat de rij op de pagina blijft, maar er wordt een kleine wijziging in de rijkop aangebracht om aan te geven dat de rij een spook is. Dit is om de prestaties tijdens een verwijderbewerking te optimaliseren. Ghosts zijn nodig voor vergrendeling op rijniveau en voor transacties met momentopname-isolatie waarbij de database-engine oudere versies van rijen moet onderhouden.

Ghost-opschoningstaak

Rijen die zijn gemarkeerd voor verwijdering of ghosted zijn, worden door het achtergrondproces voor het opschonen van ghost-gegevens verwijderd wanneer ze niet langer nodig zijn. Spookopruiming wordt periodiek uitgevoerd en controleert of er rijen op pagina's zijn die als ‘spook’ gemarkeerd zijn. Als deze worden gevonden, worden deze rijen fysiek verwijderd. Er is één thread voor het opschonen van ghosts voor alle databases in een Database Engine-exemplaar.

Wanneer een rij wordt vervaagd, wordt de database gemarkeerd als zijnde met vervaagde vermeldingen. Het ghost-opschoonproces scant alleen dergelijke databases. Het proces voor het opschonen van ghost markeert ook de database als er geen ge ghosted rijen zijn nadat alle ge ghosted rijen zijn verwijderd en slaat deze database over wanneer deze de volgende keer wordt uitgevoerd. Het proces slaat ook een database over als deze geen gedeelde vergrendeling voor de database kan verkrijgen. De volgende keer dat deze wordt uitgevoerd, wordt de overname van vergrendeling opnieuw uitgevoerd op de database.

De volgende query retourneert een geschat aantal ghost-rijen in een database.

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;

Spookopruiming uitschakelen

In systemen met veel belasting met veel verwijderingen kan het ghost-opschoningsproces de prestaties verminderen als deze veel van de vaak gebruikte pagina's in de buffergroep vervangt door andere pagina's met spookrijen. Als gevolg hiervan moeten de vaak gebruikte pagina's opnieuw worden gelezen van schijf, waardoor extra schijf-I/O wordt gegenereerd en de querylatentie wordt verhoogd. Als dit gebeurt, kunt u geestopruiming uitschakelen met traceringsvlag 661.

Zonder ghost-opschoning kan uw database onnodig groot worden, waardoor de prestaties ook kunnen worden verminderd vanwege extra I/O- en geheugenverbruik. Doordat het ghost-opschoonproces rijen verwijdert die als ghosts zijn gemarkeerd, zorgt het uitschakelen van dit proces ervoor dat deze rijen op de pagina blijven staan, waardoor de database-engine de ruimte niet opnieuw kan gebruiken. Dit dwingt de database-engine om in plaats daarvan gegevens toe te voegen aan nieuwe pagina's, wat leidt tot opgeblazen databasebestanden en ook pagina-splitsingen kan veroorzaken. Paginasplitsingen vergroten de I/O van de schijf, waardoor de queryprestaties kunnen worden verminderd. Als ghost-opschoning is uitgeschakeld, is er mogelijk onvoldoende ruimte beschikbaar voor de database.

Waarschuwing

Het uitschakelen van het ghost-cleanup-proces wordt niet aanbevolen.

Als u spookrijen wilt verwijderen wanneer geestopruiming is uitgeschakeld, bouwt u indexen opnieuw op in tabellen waar rijen zijn verwijderd. Als u een index opnieuw bouwt, worden nieuwe pagina's gemaakt op basis van bestaande gegevens, waardoor spookrijen in het proces worden weggelaten.