Configuración de limpieza de fantasmas

10

Estoy ejecutando una base de datos transaccional alta (~ 175k transacciones / minuto en promedio, casi 9 millones de registros por hora añadidos y eliminados)

Hasta hace poco, esto no ha sido un gran problema, ya que hemos estado en ~ 7.5 millones de registros agregados y eliminados, pero con la última afluencia de datos, la limpieza fantasma no parece ser capaz de mantenerse al día con la limpieza del espacio no utilizado en tablas / índices.

Hace unos días llegamos a 53 GB de 'Espacio no utilizado' en 16 tablas (en su mayoría 2 de ellas), por lo que, como resultado, comenzamos a investigar el proceso de limpieza fantasma para encontrar que se ejecuta una vez cada 5 segundos y se ejecuta en más de 10 páginas.

Mi solución actual es que temprano en la mañana estoy ejecutando tres hilos del siguiente comando:

DECLARE @2hours datetime = dateadd(hour,2,getutcdate())

WHILE getutcdate() < @2hours
BEGIN
    DBCC FORCEGHOSTCLEANUP ('DBNAME') WITH  NO_INFOMSGS
END

para ponerse al día con el retraso de la noche anterior (cuando se realizan la mayoría de nuestras eliminaciones)

Me pregunto si hay alguna forma de cambiar la configuración predeterminada de 5 segundos y 10 páginas para decir cada segundo o ejecutar más de 20 páginas, ¿hay alguna forma de hacerlo o debo continuar simplemente girando múltiples procesos de limpieza para borrar el datos, o si hay otras acciones que pueden ayudar con esto

La reindexación se ejecuta en la mayoría de los índices afectados al menos una vez por semana (la mayoría son días alternos)

SQL Server 2012 Enterprise SP3_CU8 (actualización a CU9 mañana) en el clúster de alta disponibilidad AlwaysOn también con replicación (distribución en un servidor separado)

Ste Bov
fuente

Respuestas:

4

Me pregunto si hay alguna forma de cambiar la configuración predeterminada de 5 segundos y 10 páginas para decir cada segundo o ejecutar más de 20 páginas

No, no hay ninguno. Al menos no sé a partir de ahora :-)

si hay otras acciones que pueden ayudar con esto

Del blog de Paul Randal : un método que las personas a veces consideran es forzar la limpieza de fantasmas para limpiar todo mediante una exploración de tabla o índice (poniendo en cola todos los registros eliminados para la tarea de limpieza de fantasmas).

select * from [your_problem_table] with (index = Index_that_has_large_Deletes)

¿Existe la posibilidad de particionar la tabla y purgar la partición anterior en lugar de eliminar ? FYI .. SQL Server 2016 y versiones posteriores también le permiten truncar particiones individuales.

Además, puede (PRUEBA e implementar) : deshabilitar la limpieza de fantasmas (indicador de traza 661) y luego la rebuild index WITH ONLINE = ONopción ya que está utilizando la edición Enterprise.

Si está utilizando AlwaysON (con asíncrono) con replicación, asegúrese de habilitar el indicador de seguimiento 1448 : permite que el lector de registro de replicación avance incluso si las réplicas secundarias asincrónicas no han reconocido la recepción de un cambio.

Asegúrese de leer Elimina las páginas divididas y los Fantasmas reenviados de Paul White para ver si sus tablas tienen disparadores o columnas LOB que se ralentizarían.

Kin Shah
fuente