SQL SERVER INTERIORIDADES: Como leer el DBCC Show Statistics

El comando DBCC SHOW STATISTICS es un comando que nos permite ver la información interna que SQL almacena para llevar control de la densidad y cardinalidad de una tabla con el objetivo de determinar la selectividad de una consulta. Si quieres aprender más sobre estos conceptos y sus definiciones puedes revisar en el posteo “Que son las estadísticas en SQL Server y para qué sirven”. La sintaxis del comando en su versión más simple pero completa es:

DBCC SHOW_STATISTICS ('Demo2', 'STA_Demo2_Col2_Col3');

El comando retorna tres secciones independientes: el encabezado, el vector de densidad y el histograma.

El encabezado de DBCC SHOW STATISTICS

El encabezado es la sección donde se almacena información general sobre las estadísticas.

DBCCShowStatisticsHeader

La mayoría de las columnas pueden entenderse solo con ver su nombre y no requieren mayor explicación, pero con frecuencia el ojo entrenado se fija tres secciones:

  1. UPDATED: para evaluar si la estadística es muy vieja. Es importante señalar que una estadística vieja no necesariamente es un problema, pero es un síntoma que puede estar asociado a problemas más profundos (en inglés llamados code smell). Cuando la fecha es muy vieja, deben cuestionarse: ¿Está la opción de AUTO UPDATE STATISTICS deshabilitada?; ¿Tiene la tabla deshabilitada las estadísticas(sp_autostats)? ¿Tiene la tabla actividad o cambios? ¿Se están consultando datos sobre esta columna?

La información de la fecha de actualización también puede obtenerse de la función STATS_DATE y de la vista de catálogo sys.stats.

  1. NAME: si la estadística tiene empieza con nombre con: _WA_Sys_ (por ejemplo: _WA_Sys_00000008_3C69FB99) sabemos que la estadística es auto-creada. Dicho de otra forma, existe porque se hizo una consulta sobre la columna como predicado (en un WHERE o JOIN) y que no estaba indexada como primera columna. El primer número nos indica la posición de la columna en la tabla y el segundo es el object_id de la tabla en formato hexadecimal.
  2. ROWS SAMPLED: nos fijamos si ROWS_SAMPLED y ROWS son iguales, para entender si los datos son estimados o si el histograma está basado en todas las filas. Al igual que en el primer caso, esta información no implica un problema, pero es valiosa para determinar que el índice tiene un tamaño considerable (porque usa muestreo) y que las filas que vemos en el histograma están basadas en toda la población o en una muestra que puede ser un problema cuando los datos tienen una distribución muy irregular.

Si quiere que el SHOW STATISTICS solo despliegue información sobre el encabezado, puede hacerlo usando la opción de STAT_HEADER;

DBCC SHOW_STATISTICS ('Demo2', 'STA_Demo2_Col2_Col3') WITH STAT_HEADER;

Vector de Densidad de DBCC SHOW STATISTICS

El vector de densidad tiene el cálculo general de la densidad de la columna y es valor que se usa cuando las consultas son parametrizadas (por ejemplo: WHERE StateProvinceName=@StateProvinceName). Un ejemplo de vector de densidad:

DBCCShowStatisticsDensityVector1

En el caso de las estadísticas con múltiples columnas se lleva control de densidad para cada columna, por ejemplo:

DBCCShowStatisticsDensityVector2

Entre más baja es la densidad, más selectivos son los predicados sobre esta columna y puede servir como insinuación de buenas columnas candidatas a índices.

Si desea ver la información del vector de densidad de las estadísticas, puede usar la opción:

DBCC SHOW_STATISTICS ('Demo2', 'STA_Demo2_Col2_Col3') WITH DENSITY_VECTOR;

Histograma del DBCC SHOW STATISTICS

Finalmente, tenemos la sección del histograma, que es la que requiere más experiencia para leerse de forma efectiva. Esta sección es en realidad un histograma doble, uno para rangos y otro para valores. Un ejemplo de histograma:

DBCCShowStatisticsHistogram

El histograma de rango, como su nombre lo indica da la cantidad estimada de filas entre el RANGE_HI_KEY y el RANGE_HI_KEY anterior, excluyendo ambos valores. Entonces si hacemos un gráfico sobre las columnas RANGE_HIGH_KEY y RANGE_ROWS sobre los primeros valores de histograma podemos visualmente entender mejor la información que captura.

DBCCShowStatisticsHistogram2

Debe notar que la cantidad de filas entre los valores excluye los limites, o sea que se estima hay 7.48 filas entre 1.374 y 2.2900 excluyendo ambos límites y que por la forma que se construye el histograma:

  • el primer valor de RANGE_HI_KEY es el valor mínimo de la tabla;
  • y el RANGE_ROWS de la primera fila es siempre cero, ya que no hay valores anteriores a este.

Al mismo tiempo se puede construir un histograma de los valores exactos si empleamos las columnas de RANGE_ROWS y EQ_ROWS.

DBCCShowStatisticsHistogram3

De estos gráficos se desprende que se estima hay muy pocas filas que tiene el valor 5.3940 (84.22) que son bastante menos que las que se estima tienen el valor 4.9900 (8,053.20)

Cuando se lee el histograma hay ciertos valores que sirven de guía para entender la cantidad de filas estimadas basados en los predicados.

  1. Si el predicado es de igualdad y el valor está en la llave RANGE_HI_KEY se usa el valor EQ_ROWS.
    SELECT COUNT(*) FROM Sales.SalesOrderDetail
    WHERE LineTotal='4.990000'     -- 8053.2000
  2. Si el predicado es de igualdad y el valor NO está en la llave se usa AVG_RANGE_ROWS.
    SELECT COUNT(*) FROM Sales.SalesOrderDetail
    WHERE LineTotal='5.250000'     -- 98.7761
  3. Los predicados de rango usan las filas de RANGE_ROWS cuando coinciden con las llaves del RANGE_HI_KEY y adicionalmente usan los EQ_ROWS si el rango cubre múltiples llaves (RANGE_HI_KEY)
    SELECT COUNT(*) FROM Sales.SalesOrderDetail
    WHERE LineTotal>3.990000
       AND LineTotal<4.990000     -- 78.3630

 

DBCCShowStatisticsPredicatesSi desea que el SHOW_STATISTICS solo despliegue solo la información sobre el histograma:

DBCC SHOW_STATISTICS ('Demo2', 'STA_Demo2_Col2_Col3') WITH HISTOGRAM;

Conclusión

Saber leer los resultados del comando DBCC SHOWSTATISTICS es fundamental para los administradores y desarrolladores de base de datos que necesitan entender porque sus consultas no se desempeñan como esperaban. El captar cómo funcionan las estadísticas te permite más adelante leer y entender mejor los planes de ejecución, optimización de consultas y creación de índices. Si desean aprender de algunos conceptos y definiciones puedes revisar el posteo de “Que son las estadísticas en SQL Server y para qué sirven”. Por otra parte, si eres de los que creen que ¨Las leyes, como las salchichas, dejan de inspirar respeto en la medida en que sabemos cómo se fabrican¨, entonces el posteo de  SQL SERVER Mejores prácticas: Estadísticas, puede ser más interesante.

3 respuestas a «SQL SERVER INTERIORIDADES: Como leer el DBCC Show Statistics»

  1. […] puedes leer sobre como leer estadísticas (DBCC SHOWSTATISTICS), y sobre SQL SERVER Mejores Prácticas: […]

  2. […] SERVER: Mejores Prácticas: Estadísticas” o si quiere ver detalles de lo que contienen: “SQL SERVER: Como leer DBCC SHOW STATISTICS”. Como siempre puedes bajar el código de GITHub en […]

  3. […] En posteos futuros planeo expandir el tópico de estadísticas de SQL Server y entrar en detalle en explicaciones de porque considero que estas son mejores/buenas prácticas. Si quieres aprender como leer estadísticas puedes ver Como leer estadísticas en SQL Server […]

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *