Poznámka
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Proces čištění duchů je proces na pozadí s jedním vláknem, který odstraní záznamy ze stránek označených k odstranění. Následující článek obsahuje přehled tohoto procesu.
Záznamy duchů
Záznamy, které se odstraní z úrovně listu indexové stránky, se ze stránky fyzicky neodeberou – místo toho jsou záznamy označeny jako "určeny k odstranění" nebo se označí jako zrušená viditelnost. To znamená, že řádek zůstane na stránce, ale něco se změní v záhlaví řádku, aby to indikovalo, že se jedná skutečně o neviditelný řádek. Toto slouží k optimalizaci výkonu během operace odstranění. Přízraky jsou nezbytné pro uzamykání na úrovni řádků, ale také pro izolaci snímků, kde je potřeba udržovat starší verze řádků.
Úloha pro vyčištění záznamů duchů
Záznamy, které jsou označené k odstranění nebo stínové, se vyčistí procesem čištění duchů na pozadí. Tento proces na pozadí se spustí někdy po potvrzení transakce odstranění a fyzicky odebere záznamy označené k odstranění ze stránek. Proces čištění duchů se automaticky spustí v intervalu (každých 5 sekund pro SQL Server 2012+, každých 10 sekund pro SQL Server 2008/2008R2) a zkontroluje, jestli některé stránky byly označené stínovými záznamy. Pokud nějaký najde, přistoupí k odstranění záznamů, které jsou označeny k odstranění nebo skryty, přičemž při každém spuštění ovlivní maximálně 10 stránek.
Když je záznam zkopírovaný, databáze se označí jako položky s duchy a proces čištění duchů bude skenovat pouze tyto databáze. Proces čištění duchů také označí databázi jako "nemá žádné stínové záznamy", jakmile se odstraní všechny stínové záznamy, a při příštím spuštění tuto databázi přeskočí. Proces také přeskočí všechny databáze, na které nemůže získat sdílený zámek, a zkusí to znovu při příštím spuštění.
Následující dotaz může identifikovat, kolik stínových záznamů existuje v jedné databázi.
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
Zakázání čištění duchů
V systémech s vysokým zatížením a mnoha odstraněními může proces nazývaný "ghost cleanup" způsobit problém s výkonem, protože uchovává stránky ve fondu vyrovnávací paměti a generuje IO operace. Je tedy možné tento proces zakázat pomocí příznaku trasování 661. Zakázání procesu ale má vliv na výkon.
Zakázáním procesu čištění duchů může dojít k zbytečnému zvětšování databáze a může vést k problémům s výkonem. Vzhledem k tomu, že proces čištění duchů odebere záznamy, které jsou označené jako duchové, zakázání tohoto procesu ponechá tyto záznamy na stránce, což zabrání SQL Serveru v opětovném využití tohoto místa. To vynutí SQL Server přidávat data na nové stránky, což vede k nadměrným velikostem databázových souborů a může rovněž vést k rozdělení stránek. Rozdělení stránek vede k problémům s výkonem při vytváření výkonnostních plánů a při provádění skenovacích operací.
Jakmile je proces čištění duchů zakázaný, je potřeba provést nějakou akci, aby se odebraly stínové záznamy. Jednou z možností je spustit opětovné sestavení indexu, které přesune data na stránkách. Další možností je ruční spuštění sp_clean_db_free_space (vyčištění všech databázových datových souborů) nebo sp_clean_db_file_free_space (vyčištění jediného databázového datového souboru), které odstraní duchové záznamy.
Výstraha
Zakázání procesu čištění duchů se obecně nedoporučuje. Před trvalým implementací v produkčním prostředí by to mělo být důkladně otestováno v řízeném prostředí.