Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Rensningsprocessen för spöken är en enkeltrådad bakgrundsprocess som tar bort poster från sidor som har markerats för borttagning. Följande artikel innehåller en översikt över den här processen.
Spökposter
Poster som tas bort från en lövnivå på en indexsida tas inte bort fysiskt från sidan . Posten markeras i stället som "tas bort" eller spökas. Det innebär att raden finns kvar på sidan men en bit ändras i radrubriken för att indikera att raden verkligen är ett spöke. Detta sker för att optimera prestanda under en borttagningsåtgärd. Spöken är nödvändiga för låsning på radnivå, men är också nödvändiga för ögonblicksbildisolering där vi behöver underhålla de äldre versionerna av rader.
Rensningsuppgift för spökposter
Poster som har markerats för borttagning, eller som är "ghostade", rensas upp av bakgrundsrensningsprocessen för spökposter. Den här bakgrundsprocessen körs någon gång efter att borttagningstransaktionen har bekräftats och tar fysiskt bort spökposter från sidorna. Spökrensningsprocessen körs automatiskt med ett intervall (var 5:e sekund för SQL Server 2012+, var 10:e sekund för SQL Server 2008/2008R2) och kontrollerar om några sidor har markerats med spökposter. När det hittar några, så raderar det de poster som är markerade för borttagning eller är ghostade, och berör som mest 10 sidor per körning.
När en post markeras som spökad, markeras databasen som att den har spökposter, och spökrensningsprocessen scannar endast dessa databaser. Rensningsprocessen för spöken markerar också databasen som "har inga spökposter" när alla spökposter har tagits bort, och den hoppar över den här databasen nästa gång den körs. Processen hoppar också över alla databaser som inte kan ta ett delat lås på och försöker igen nästa gång det körs.
Följande frågeställning kan identifiera hur många spökposter som finns i en enda databas.
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
Inaktivera spökrensningen
På system med hög belastning och många borttagningar kan spökrensning orsaka prestandaproblem genom att hålla sidor kvar i buffertpoolen och generera I/O. Därför är det möjligt att inaktivera den här processen med hjälp av spårningsflagga 661. Det finns dock prestandakonsekvenser vid inaktivering av processen.
Om du inaktiverar spökrensningsprocessen kan databasen bli onödigt stor och kan leda till prestandaproblem. Eftersom rensningsprocessen för spöken tar bort poster som har markerats som spöken lämnar inaktivering av processen dessa poster på sidan, vilket hindrar SQL Server från att återanvända det här utrymmet. Detta tvingar SQL Server att lägga till data på nya sidor i stället, vilket leder till uppsvällda databasfiler och kan också orsaka siddelningar. Sidsplittringar leder till prestandaproblem vid skapandet av körningsplaner och vid utförandet av sökoperationer.
När rensningsprocessen för spöken har inaktiverats måste vissa åtgärder vidtas för att ta bort de spökade posterna. Ett alternativ är att köra ett återskapande av index, vilket flyttar data runt på sidor. Ett annat alternativ är att köra sp_clean_db_free_space manuellt (för att rensa alla databasdatafiler) eller sp_clean_db_file_free_space (för att rensa en enskild databasdatafil), vilket tar bort spökposter.
Varning
Det rekommenderas vanligtvis inte att inaktivera rensningsprocessen för spöken. Detta bör testas noggrant i en kontrollerad miljö innan det implementeras permanent i en produktionsmiljö.