Compartir por


Guía del proceso de limpieza fantasma

La limpieza fantasma es un proceso en segundo plano que elimina físicamente las filas marcadas para su eliminación por 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 al nivel de hoja de un índice no se eliminan físicamente del todo de la página. En cambio, la fila se marca para su eliminación futura o quedará en modo oculto. Esto significa que la fila permanece en la página, pero un bit se cambia en el encabezado de fila para indicar que la fila es un fantasma. Esto sirve para optimizar el rendimiento durante una operación de eliminación. Los fantasmas son necesarios para el bloqueo de nivel de fila y para las transacciones de aislamiento de instantáneas en las que el motor de base de datos debe mantener versiones de fila anteriores.

Tarea de limpieza fantasma

Las filas que están marcadas para su eliminación o como fantasma son limpiadas por el proceso de limpieza de fantasmas en segundo plano cuando ya no se requieren. La limpieza fantasma se ejecuta periódicamente y comprueba si alguna página tiene 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 está fantasma, la base de datos se marca con entradas fantasma. El proceso de limpieza fantasma solo examina estas 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. Reintenta la adquisición de bloqueos en 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 de carga alta con muchas eliminaciones, el proceso de limpieza fantasma podría afectar el rendimiento si reemplaza muchas de las páginas a las que se accede con frecuencia en el pool de búferes por otras páginas con 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. Al volver a generar un índice, se crean nuevas páginas a partir de datos existentes y se omiten las filas fantasma del proceso.