Condividi tramite


Guida al processo di pulizia fantasma

La ghost cleanup è un processo in background che rimuove fisicamente le righe contrassegnate per l'eliminazione dalle istruzioni DML. L'articolo seguente offre una panoramica di questo processo.

Righe fantasma

Le righe eliminate dalle pagine a livello foglia di un indice non vengono rimosse fisicamente dalla pagina. La riga viene invece contrassegnata per la rimozione futura o resa invisibile. Ciò significa che la riga rimane nella pagina, ma una parte viene modificata nell'intestazione della riga per indicare che la riga è 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 e per le transazioni di isolamento dello snapshot in cui il motore di database deve mantenere le versioni precedenti delle righe.

Attività di pulizia fantasma

Le righe contrassegnate per l'eliminazione, o ghosted, vengono pulite dal processo di pulizia fantasma in background quando non sono più necessarie. La pulizia fantasma viene eseguita periodicamente e controlla se le pagine hanno righe fantasma. Se viene trovato, rimuove fisicamente queste righe. Esiste un singolo thread di pulizia fantasma per tutti i database in un'istanza del motore di database.

Quando una riga è fantasma, il database viene contrassegnato come avente record fantasma. Il processo di pulizia fantasma analizza solo tali database. Il processo di pulizia fantasma contrassegna anche il database come senza righe fantasma una volta rimosse tutte le righe fantasma e ignora questo database alla successiva esecuzione. Il processo ignora anche qualsiasi database se non riesce ad acquisire un blocco condiviso nel database. Ritenta l'acquisizione del blocco nel database alla successiva esecuzione.

La query seguente restituisce un numero approssimativo di righe fantasma in un 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;

Disabilitare la pulizia fantasma

Nei sistemi ad alto carico con molte eliminazioni, il processo di pulizia fantasma potrebbe ridurre le prestazioni se sostituisce molte delle pagine a cui si accede di frequente nel pool di buffer con altre pagine con righe fantasma. Di conseguenza, le pagine a cui si accede di frequente devono essere rilette dal disco, generando operazioni di I/O aggiuntive su disco e aumentando la latenza di query. In questo caso, è possibile disabilitare la pulizia fantasma usando il flag di traccia 661.

Senza la pulizia fantasma, il database può aumentare inutilmente le dimensioni, riducendo così le prestazioni a causa di un utilizzo aggiuntivo di I/O e memoria. Poiché il processo di pulizia fantasma rimuove le righe contrassegnate come fantasmi, la disabilitazione del processo lascia queste righe nella pagina, impedendo al motore di database di riutilizzare questo spazio. Ciò impone al motore di database di aggiungere dati a nuove pagine, causando invece file di database gonfi e può anche causare divisioni di pagina. Le suddivisioni di pagine aumentano l'I/O del disco, riducendo così le prestazioni delle query. Se la pulizia fantasma è disabilitata, il database potrebbe esaurire lo spazio.

Avvertimento

La disabilitazione del processo di pulizia fantasma in modo permanente non è consigliata.

Per rimuovere le righe fantasma quando la pulizia fantasma è disabilitata, ricompilare gli indici nelle tabelle in cui sono state eliminate le righe. La ricompilazione di un indice crea nuove pagine da dati esistenti, omettendo righe fantasma nel processo.