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 delete
consulta 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 FULLSCAN
opció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 statistics
la base de datos y ejecutarla UPDATE STATISTICS
manualmente 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 statistics
en 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
SELECT
ocurre un e incluso entoncesSELECT
tiene 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_ROWS
columna 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_ROWS
y 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_ROWS
para 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