Tenemos una consulta de actualización SQL algo compleja que se ejecuta algunas veces al mes. La mayoría de las veces parece funcionar realmente rápido, pero en algunas bases de datos, lleva mucho tiempo. Después de ejecutar un "ESTADÍSTICAS DE ACTUALIZACIÓN" en las tablas involucradas, la actualización se ejecuta inmediatamente de inmediato. Finalmente, configuramos una tarea nocturna que llama a ACTUALIZAR ESTADÍSTICAS en todas las tablas de la base de datos. Pero eso no pareció solucionar el problema. Todavía estamos terminando teniendo que ejecutar "ESTADÍSTICAS DE ACTUALIZACIÓN" manualmente cada vez. ¿Por qué las estadísticas se estancan tan rápido?¿Por qué las estadísticas se desactualizan tan rápido en SQL Server?
Aquí es aproximadamente lo que se ve la consulta como:
UPDATE DataTableA
SET DataTableA.IndexedColumn1 = 123456789, DataTableA.Flag1 = 1
FROM DataTableA WITH (INDEX(IX_DataTableA))
INNER JOIN GroupingTableA ON GroupingTableA.ForeignKey1 = GroupingTableA.PrimaryKey
INNER JOIN LookupTableA ON DataTableA.ForeignKey3 = LookupTableA.PrimaryKey
LEFT OUTER JOIN GroupingTableB ON DataTableA.IndexedColumn2 = GroupingTableB.IndexedColumn2
WHERE GroupingTableB.IndexedColumn1 = 123456789
AND DataTableA.IndexedColumn1 IS NULL
AND DataTableA.IndexedColumn2 IN (... 300 entries here ...)
AND DataTableA.Deleted = 0
AND GroupingTableA.Date <= GroupingTableB.EndDate
AND GroupingTableA.Date >= DATEADD(month, -1, GroupingTableB.StartDate)
AND LookupTableA.Column2 = 1
AND DataTableA.Status1 IN (1, 3)
AND DataTableA.Status2 NOT IN (1, 3, 9)
DataTableA contiene millones de filas.
GroupingTableA y GroupingTableB contienen decenas de miles de filas.
LookupTableA contiene docenas de filas.
Índice IX_DataTableA es un índice en (ASC IndexedColumn1, IndexedColumn2 ASC)
Mediante prueba y error, determinamos que GroupingTableB en el ejemplo anterior es lo que se está desactualizando. El problema todavía ocurre, pero lo solucionamos llamando a "ACTUALIZAR ESTADÍSTICAS" en esa tabla cada vez que hacemos una inserción en él. No es exactamente la solución ideal ... –
Sé que esta pregunta es antigua, pero vale la pena, en el momento en que pones una condición en 'GroupingTableB' en la cláusula WHERE, lógicamente convierte su' LEFT JOIN' en 'INNER JOIN '. Tienes 3 condiciones como esta. Si desea que el 'LEFT JOIN' funcione realmente como una unión' OUTER' apropiada, entonces esas condiciones se deben mover a la cláusula 'ON' en' LEFT JOIN'. Solo digo ... :) – ErikE