Estoy tratando de entender cómo funciona el muestreo estadístico y si lo siguiente es o no el comportamiento esperado en las actualizaciones de estadísticas muestreadas.
Tenemos una tabla grande dividida por fecha con un par de miles de millones de filas. La fecha de partición es la fecha comercial anterior y, por lo tanto, es una clave ascendente. Solo cargamos datos en esta tabla para el día anterior.
La carga de datos se ejecuta durante la noche, por lo que el viernes 8 de abril cargamos datos para el 7.
Después de cada ejecución, actualizamos las estadísticas, aunque tomamos una muestra, en lugar de una FULLSCAN
.
Tal vez estoy siendo ingenuo, pero hubiera esperado que SQL Server identificara la clave más alta y la clave más baja en el rango para garantizar que obtuviera una muestra de rango precisa. De acuerdo con este artículo :
Para el primer segmento, el límite inferior es el valor más pequeño de la columna en la que se genera el histograma.
Sin embargo, no menciona el último cubo / valor más grande.
Con la actualización de estadísticas muestreada en la mañana del 8, la muestra perdió el valor más alto en la tabla (el 7).
Como hacemos muchas consultas sobre datos del día anterior, esto resultó en una estimación de cardinalidad inexacta y una cantidad de consultas que expiraron.
¿Debería SQL Server no identificar el valor más alto para esa clave y usarlo como máximo RANGE_HI_KEY
? ¿O es solo uno de los límites de actualización sin usar FULLSCAN
?
Versión SQL Server 2012 SP2-CU7. Actualmente no podemos actualizar debido a un cambio en el OPENQUERY
comportamiento en SP3 que estaba redondeando los números en una consulta de servidor vinculado entre SQL Server y Oracle.