Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Il processo di pulizia fantasma è un processo in background a thread singolo che elimina i record delle pagine contrassegnate per l'eliminazione. L'articolo seguente offre una panoramica di questo processo.
Registri fantasma
I record eliminati da un livello foglia di una pagina di indice non vengono rimossi fisicamente dalla pagina. Il record viene invece contrassegnato come "da eliminare" o fantasma. Ciò significa che la riga rimane nella pagina, ma viene modificata leggermente nell'intestazione per indicare che si tratta davvero di una riga fantasma. Questa impostazione ha lo scopo di ottimizzare le prestazioni durante un'operazione di eliminazione. I fantasmi sono necessari per il blocco a livello di riga, ma sono necessari anche per l'isolamento dello snapshot, in cui è necessario mantenere le versioni precedenti delle righe.
Attività di pulizia dei record fantasma
I record contrassegnati per l'eliminazione o marcati come fantasma vengono puliti dal processo di pulizia dei fantasmi in background. Questo processo in background viene eseguito qualche volta dopo il commit della transazione di eliminazione e rimuove fisicamente i record fantasma dalle pagine. Il processo di pulizia fantasma viene eseguito automaticamente in un intervallo (ogni 5 secondi per SQL Server 2012+, ogni 10 secondi per SQL Server 2008/2008R2) e verifica se le pagine sono state contrassegnate con record fantasma. Se ne trova, allora cancella i record contrassegnati per l'eliminazione o come fantasma, toccando al massimo 10 pagine con ogni esecuzione.
Quando un record è ghosted, il database viene contrassegnato come contenente voci fantasma e il processo di pulizia dei dati fantasma analizzerà solo tali database. Il processo di pulizia fantasma contrassegnerà anche il database come "senza record fantasma" una volta eliminati tutti i record fantasma e salterà il database alla successiva esecuzione. Il processo ignora anche tutti i database su cui non è possibile eseguire un blocco condiviso e riprova la volta successiva.
La query seguente consente di identificare il numero di record fantasma presenti in un singolo database.
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
Disabilitare la pulizia fantasma
Nei sistemi ad alto carico con numerose eliminazioni, il processo di pulizia fantasma può causare un problema di prestazioni a causa della conservazione delle pagine nel pool di buffer e dalla generazione di operazioni di I/O. Di conseguenza, è possibile disabilitare questo processo con l'uso del flag di traccia 661. Tuttavia, esistono implicazioni per le prestazioni dalla disabilitazione del processo.
La disabilitazione del processo di pulizia fantasma può causare un aumento inutilmente elevato del database e può causare problemi di prestazioni. Poiché il processo di pulizia fantasma rimuove i record contrassegnati come fantasmi, la disabilitazione del processo lascerà questi record nella pagina, impedendo a SQL Server di riutilizzare questo spazio. Ciò impone a SQL Server di aggiungere dati a nuove pagine, causando invece file di database gonfi e può anche causare divisioni di pagina. Le divisioni di pagina comportano problemi di prestazioni durante la creazione di piani di esecuzione e durante l'esecuzione di operazioni di analisi.
Una volta disabilitato il processo di pulizia fantasma, è necessario eseguire alcune azioni per rimuovere i record fantasma. Un'opzione consiste nell'eseguire una ricompilazione dell'indice, che sposta i dati nelle pagine. Un'altra opzione consiste nell'eseguire manualmente sp_clean_db_free_space (per pulire tutti i file di dati del database) o sp_clean_db_file_free_space (per pulire un singolo file di dati del database), che eliminerà i record fantasma.
Avvertimento
La disabilitazione del processo di pulizia fantasma non è in genere consigliata. Questa operazione deve essere testata accuratamente in un ambiente controllato prima di essere implementata in modo permanente in un ambiente di produzione.