Partager via


Guide du processus de nettoyage fantôme

Le processus de nettoyage fantôme est un processus d’arrière-plan à thread unique qui supprime les enregistrements des pages marquées pour suppression. L’article suivant fournit une vue d’ensemble de ce processus.

Enregistrements fantômes

Les enregistrements supprimés du niveau feuille d'une page d'index ne sont pas physiquement retirés de la page ; à la place, l'enregistrement est marqué comme « à supprimer » ou fantôme. Cela signifie que la ligne reste sur la page, mais un élément est modifié dans l’en-tête de ligne pour indiquer que la ligne est véritablement un fantôme. Ceci a pour but d’optimiser les performances durant une opération de suppression. Les fantômes sont nécessaires pour le verrouillage au niveau des lignes, mais sont également nécessaires pour l’isolation des captures instantanées où nous devons conserver les versions antérieures des lignes.

Tâche de nettoyage d’enregistrement fantôme

Les enregistrements marqués pour suppression ou fantômes sont nettoyés par le processus de nettoyage fantôme d’arrière-plan. Ce processus en arrière-plan s’exécute parfois après la validation de la transaction de suppression et supprime physiquement les enregistrements fantômes des pages. Le processus de nettoyage fantôme s’exécute automatiquement sur un intervalle (toutes les 5 secondes pour SQL Server 2012+, toutes les 10 secondes pour SQL Server 2008/2008R2) et vérifie si des pages ont été marquées avec des enregistrements fantômes. S'il en trouve, il supprime alors les enregistrements marqués pour suppression, ou fantômes, affectant au plus 10 pages avec chaque exécution.

Lorsqu’un enregistrement devient fantôme, la base de données est marquée comme ayant des entrées fantômes, et le processus de nettoyage fantôme ne scannera que ces bases de données. Le processus de nettoyage fantôme marque également la base de données comme « n’ayant pas d’enregistrements fantômes » une fois que tous les enregistrements fantômes ont été supprimés, et il ignore cette base de données la prochaine fois qu’elle s’exécute. Le processus ignore également les bases de données sur lesquelles il ne peut pas prendre un verrou partagé, et réessaye la prochaine fois qu'il s’exécute.

La requête ci-dessous peut identifier le nombre d’enregistrements fantômes qui existent dans une base de données unique.

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

Désactiver le nettoyage fantôme

Sur les systèmes à charge élevée avec de nombreuses suppressions, le processus de nettoyage fantôme peut entraîner un problème de performances en conservant les pages dans le cache mémoire et en générant des opérations d'entrée/sortie (E/S). Par conséquent, il est possible de désactiver ce processus avec l’utilisation de l’indicateur de trace 661. Toutefois, il existe des implications en matière de performances lors de la désactivation du processus.

La désactivation du processus de nettoyage fantôme peut entraîner une croissance inutilement importante de votre base de données et peut entraîner des problèmes de performances. Étant donné que le processus de nettoyage fantôme supprime les enregistrements marqués comme fantômes, la désactivation du processus laisse ces enregistrements sur la page, ce qui empêche SQL Server de réutiliser cet espace. Cela force SQL Server à ajouter des données à de nouvelles pages, ce qui entraîne des fichiers de base de données gonflés et peut également entraîner des fractionnements de pages. Les fractionnements de page entraînent des problèmes de performances lors de la création de plans d’exécution et lors des opérations d’analyse.

Une fois le processus de nettoyage fantôme désactivé, certaines actions doivent être effectuées pour supprimer les enregistrements fantômes. Une option consiste à exécuter une reconstruction d’index, qui déplace les données sur les pages. Une autre option consiste à exécuter manuellement sp_clean_db_free_space (pour nettoyer tous les fichiers de données de base de données) ou sp_clean_db_file_free_space (pour nettoyer un fichier de données de base de données unique), qui supprime les enregistrements fantômes.

Avertissement

La désactivation du processus de nettoyage fantôme n’est généralement pas recommandée. Cette opération doit être testée minutieusement dans un environnement contrôlé avant d’être implémentée définitivement dans un environnement de production.