Tengo un almacén de datos de 200 GB en SQL Server.
He estado experimentando tiempos de ejecución realmente lentos para algunas consultas; por ejemplo 12 horas para una deleteconsulta simple con un inner join.
Después de investigar un poco con los planes de ejecución, actualicé las estadísticas de las 2 tablas involucradas en la consulta, utilizando la WITH FULLSCANopción.
La consulta ahora se ejecuta en menos de un segundo, por lo que parece que las estadísticas no estaban actualizadas.
Estoy considerando deshabilitar auto update statisticsla base de datos y ejecutarla UPDATE STATISTICSmanualmente después de cargar el almacén de datos. El almacén de datos se carga de forma incremental desde un sistema ERP de origen diariamente, por la noche.
¿Estoy en lo cierto al suponer que auto update statisticsen un escenario de almacenamiento de datos no es realmente útil? En cambio, ¿tiene más sentido actualizar las estadísticas manualmente después de cargar los datos?

Respuestas:
Aquí hay un documento técnico sobre cuándo se produce la actualización automática de estadísticas . Estos son los puntos más destacados con respecto a las actualizaciones automáticas de estadísticas:
Entonces, @JNK señaló en un comentario que si tiene mil millones de filas en una tabla, necesitaría tener 20,000,5000 escrituras en la primera columna de la estadística para activar una actualización.
Tomemos la siguiente estructura:
Ahora podemos verificar qué sucedió en las estadísticas de la tierra.
Sin embargo, para ver si este es un objeto estadístico significativo, necesitamos:
Entonces esta estadística no se ha actualizado. Esto se debe a que parece que la estadística no se actualiza hasta que
SELECTocurre un e incluso entoncesSELECTtiene que quedar fuera de lo que SQL Server tiene dentro de su histograma. Aquí hay un script de prueba que ejecuté para probar esto:En lugar de deshabilitar ciegamente las estadísticas de auto_update, trataría de examinar su conjunto de datos en busca de sesgo. Si sus datos muestran un sesgo significativo, entonces debe considerar la creación de estadísticas filtradas y luego decidir si administrar las actualizaciones de estadísticas manualmente es el curso de acción correcto.
Para analizar la asimetría, debe ejecutar
DBCC SHOW_STATISTICS(<stat_object>, <index_name>);(en el script anterior sin elWITH STAT_HEADER) la combinación estadística / índice particular que desea examinar. Una forma rápida de mirar su sesgo sería mirar el histograma (tercer conjunto de resultados) y verificar la varianza en suEQ_ROWS. Si es bastante consistente, entonces tu sesgo es mínimo. Para avanzar, mire laRANGE_ROWScolumna y observe la varianza allí, ya que esto mide cuántas filas existen entre cada paso. Finalmente, puede tomar el[All density]resultado delDENSITY_VECTOR(segundo conjunto de resultados) y multiplicarlo por el[Rows Sampled]valor en elSTAT_HEADER(primer conjunto de resultados) y ver cuál sería la expectativa promedio para una consulta en esa columna. Compara ese promedio con suEQ_ROWSy si hay muchos lugares donde varía significativamente, entonces tienes sesgo.Si encuentra que tiene sesgo, entonces debe considerar la creación de algunas estadísticas filtradas en los rangos que tienen alto muy alto
RANGE_ROWSpara que pueda dar pasos adicionales para mejores estimaciones de esos valores.Una vez que tenga estas estadísticas filtradas, puede ver la posibilidad de actualizar las estadísticas manualmente.
fuente