Compartir a través de


sys.dm_db_stats_histogram (Transact-SQL)

Aplica a: SQL Server 2016 (13.x) y versiones posteriores Azure SQL DatabaseAzure SQL Managed InstanceSQL database in Microsoft Fabric

Devuelve el histograma de estadísticas para el objeto de base de datos especificado (tabla o vista indexada) en la base de datos de SQL Server actual. Similar a DBCC SHOW_STATISTICS WITH HISTOGRAM.

Nota:

Esta DMF está disponible a partir de SQL Server 2016 (13.x) SP1 CU2.

Sintaxis

sys.dm_db_stats_histogram (object_id , stats_id)

Argumentos

object_id

Identificador del objeto de la base de datos actual para la que se solicitan las propiedades de una de sus estadísticas. object_id es int.

stats_id

Identificador de estadísticas del object_id especificado. El identificador de estadísticas se puede obtener desde la vista de administración dinámica sys.stats . stats_id es int.

Tabla devuelta

Nombre de la columna Tipo de datos Descripción
object_id int Identificador del objeto (tabla o vista indizada) para el que se devuelven las propiedades del objeto de estadísticas.
stats_id int Identificador del objeto de estadísticas. Es único dentro de la vista indizada o la tabla. Para obtener más información, consulte sys.stats.
step_number int Número del paso en el histograma.
range_high_key sql_variant Valor de columna límite superior de un paso del histograma. El valor de columna también se denomina valor de clave.
range_rows real Número calculado de filas cuyo valor de columna está comprendido en un paso del histograma, sin incluir el límite superior.
equal_rows real Número calculado de filas cuyo valor de columna es igual al límite superior del paso del histograma.
distinct_range_rows bigint Número calculado de filas que tienen un valor de columna distinto en un paso del histograma, sin incluir el límite superior.
average_range_rows real Promedio de filas con valores de columna duplicados en un paso del histograma, sin incluir el límite superior (RANGE_ROWS / DISTINCT_RANGE_ROWS para DISTINCT_RANGE_ROWS > 0).

Comentarios

El conjunto de resultados para sys.dm_db_stats_histogram devuelve información similar a DBCC SHOW_STATISTICS WITH HISTOGRAM y también incluye object_id, stats_id y step_number.

Dado que la columna range_high_key es un tipo de datos sql_variant, es posible que tenga que usar CAST o CONVERT si un predicado realiza la comparación con una constante que no es de cadena.

Histograma

Un histograma mide la frecuencia de aparición de cada valor distinto en un conjunto de datos. El optimizador de consultas calcula un histograma de los valores de la primera columna de clave del objeto de estadísticas; para ello, selecciona los valores de la columna tomando una muestra estadística de las filas o realizando un análisis completo de todas las filas de la tabla o vista. Si el histograma se crea a partir de un conjunto muestreado de filas, los totales almacenados para el número de filas y el número de valores distintos son estimaciones y no es necesario que sean enteros enteros.

Para crear el histograma, el optimizador de consultas ordena los valores de columna, calcula el número de valores que coinciden con cada valor de columna distinto y, a continuación, agrupa los valores de columna en un máximo de 200 pasos de histograma contiguos. Cada paso incluye un intervalo de valores de columna seguido de un valor de columna de límite superior. El intervalo incluye todos los valores de columna posibles comprendidos entre los valores límite (sin incluir los propios valores límite). El valor de columna ordenado más pequeño es el valor del límite superior del primer paso del histograma.

En el diagrama siguiente se muestra un histograma con seis pasos. El área a la izquierda del primer valor límite superior es el primer paso.

Diagrama de cómo se calcula un histograma a partir de valores de columna muestreados.

En cada paso del histograma:

  • La línea gruesa representa el valor de límite superior (range_high_key) y el número de veces que tiene lugar (equal_rows).

  • El área de color sólido situada a la izquierda de range_high_key representa el rango de valores de columna y el número medio de veces que tiene lugar cada valor de columna (average_range_rows). El valor de average_range_rows en el primer paso del histograma siempre es 0.

  • Las líneas de puntos representan los valores de las muestras utilizados para estimar el número total de valores distintos que hay en el rango (distinct_range_rows) y el número total de valores que hay en el rango (range_rows). El optimizador de consultas usa range_rows y distinct_range_rows para calcular average_range_rows y no almacena los valores muestreados.

El optimizador de consultas define los pasos del histograma en función de su importancia estadística. Utiliza un algoritmo de diferencias máximas para minimizar el número de pasos del histograma a la vez que minimiza las diferencias entre los valores límite. El número máximo de pasos es 200. El número de pasos del histograma puede ser menor que el número de valores distintos, incluso para las columnas con menos de 200 puntos de límite. Por ejemplo, una columna con 100 valores distintos puede tener un histograma con menos de 100 puntos de límite.

Permisos

Requiere que el usuario tenga permisos seleccionados en columnas de estadísticas o que el usuario posee la tabla o que el usuario sea miembro del rol fijo de servidor sysadmin , el rol fijo de base de datos db_owner o el rol fijo de base de datos db_ddladmin .

Ejemplos

A. Ejemplo básico

En el ejemplo siguiente se crea y se rellena una tabla básica. A continuación, crea estadísticas en la columna Region_Name.

CREATE TABLE Region
(
    Region_ID INT IDENTITY PRIMARY KEY,
    Region_Name VARCHAR (120) NOT NULL
);

INSERT Region (Region_Name)
VALUES ('Canada'), ('Denmark'), ('Iceland'), ('Peru');

CREATE STATISTICS Region_Stats ON Region(Region_Name);

La clave principal ocupa el stat_id número 1, por lo que llame a sys.dm_db_stats_histogram para el stat_id número 2 para devolver el histograma de estadísticas de la tabla Region.

SELECT * FROM sys.dm_db_stats_histogram(OBJECT_ID('Region'), 2);

B. Consulta útil

SELECT hist.step_number,
       hist.range_high_key,
       hist.range_rows,
       hist.equal_rows,
       hist.distinct_range_rows,
       hist.average_range_rows
FROM sys.stats AS s
CROSS APPLY sys.dm_db_stats_histogram(s.[object_id], s.stats_id) AS hist
WHERE s.[name] = N'<statistic_name>';

C. Consulta útil

En el ejemplo siguiente se selecciona de la tabla Region con un predicado en la columna Region_Name.

SELECT * FROM Region
WHERE Region_Name = 'Canada';

En el ejemplo siguiente se examina la estadística creada anteriormente en la tabla Region y la columna Region_Name para el paso de histograma que coincide con el predicado de la consulta anterior.

SELECT ss.name,
       ss.stats_id,
       shr.steps,
       shr.rows,
       shr.rows_sampled,
       shr.modification_counter,
       shr.last_updated,
       sh.range_rows,
       sh.equal_rows
FROM sys.stats AS ss
     INNER JOIN sys.stats_columns AS sc
         ON ss.stats_id = sc.stats_id
        AND ss.object_id = sc.object_id
     INNER JOIN sys.all_columns AS ac
         ON ac.column_id = sc.column_id
        AND ac.object_id = sc.object_id
CROSS APPLY sys.dm_db_stats_properties(ss.object_id, ss.stats_id) AS shr
CROSS APPLY sys.dm_db_stats_histogram(ss.object_id, ss.stats_id) AS sh
WHERE ss.[object_id] = OBJECT_ID('Region')
      AND ac.name = 'Region_Name'
      AND sh.range_high_key = CAST ('Canada' AS CHAR (8));