Guía del proceso de limpieza fantasma

La limpieza de fantasmas es un proceso en segundo plano que elimina físicamente las filas marcadas para su eliminación mediante instrucciones DML. En el siguiente artículo se proporciona información general sobre este proceso.

Filas fantasma

Las filas que se eliminan de las páginas de nivel hoja de un índice no se eliminan físicamente de la página. En su lugar, la fila se marca para su futura eliminación, o se convierte en fantasma. Esto significa que la fila permanece en la página, pero se modifica un bit en el encabezado de la fila para indicar que se trata de una fila fantasma. Esto sirve para optimizar el rendimiento durante una operación de eliminación. Las filas fantasma son necesarias para el bloqueo a nivel de fila y para las transacciones con aislamiento de instantánea, en las que el motor de la base de datos debe conservar versiones anteriores de las filas.

Tarea de limpieza fantasma

Las filas marcadas para su eliminación, o fantasmas, son eliminadas por el proceso de limpieza de fantasmas en segundo plano cuando ya no son necesarias. La limpieza de fantasmas se ejecuta periódicamente y comprueba si alguna página contiene filas fantasma. Si encuentra algunas, elimina físicamente estas filas. Hay un único subproceso de limpieza fantasma para todas las bases de datos de una instancia del motor de base de datos.

Cuando una fila se convierte en fantasma, la base de datos se marca como si tuviera entradas fantasma. El proceso de limpieza de fantasmas solo analiza dichas bases de datos. El proceso de limpieza fantasma también marca la base de datos como que no tiene filas fantasma una vez que se quitan todas las filas fantasma y omite esta base de datos la próxima vez que se ejecute. El proceso también omite cualquier base de datos si no puede adquirir un bloqueo compartido en la base de datos. Vuelve a intentar adquirir el bloqueo de la base de datos la próxima vez que se ejecute.

La consulta siguiente devuelve un número aproximado de filas fantasma en una base de datos.

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;

Deshabilitación de la limpieza de fantasmas

En sistemas con alta carga y numerosas eliminaciones, el proceso de limpieza de fantasmas podría reducir el rendimiento si sustituye muchas de las páginas a las que se accede con frecuencia en el grupo de búfer por otras páginas que contienen filas fantasma. Como resultado, las páginas a las que se accede con frecuencia deben volver a leerse desde el disco, generar E/S de disco adicional y aumentar la latencia de las consultas. Si esto ocurre, puede deshabilitar la limpieza de fantasmas mediante la marca de seguimiento 661.

Sin la limpieza fantasma, la base de datos puede crecer innecesariamente grande, lo que también puede reducir el rendimiento debido al consumo de E/S y memoria adicionales. Dado que el proceso de limpieza fantasma quita las filas marcadas como fantasmas, al deshabilitar el proceso se dejan estas filas en la página, lo que impide que el motor de base de datos reutilice este espacio. Esto obliga al motor de base de datos a agregar datos a páginas nuevas en su lugar, lo que conduce a archivos de base de datos inflados y también puede provocar divisiones de página. Las divisiones de página aumentan la E/S de disco, lo que puede reducir el rendimiento de las consultas. Si la limpieza fantasma está deshabilitada, el espacio de la base de datos podría agotarse.

Advertencia

No se recomienda deshabilitar el proceso de limpieza fantasma de forma permanente.

Para quitar filas fantasma cuando se deshabilita la limpieza de fantasmas, vuelva a generar índices en tablas donde se eliminaron las filas. La reconstrucción de un índice crea nuevas páginas a partir de los datos existentes, omitiendo las filas fantasma en el proceso.