sys.dm_db_stats_histogram (Transact-SQL)

Aplica-se a: SQL Server 2016 (13.x) e posterior Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure

Retorna o histograma de estatísticas do objeto de banco de dados especificado (tabela ou exibição indexada) no banco de dados atual do SQL Server. Similar a DBCC SHOW_STATISTICS WITH HISTOGRAM.

Observação

Esse DMF está disponível a partir do SQL Server 2016 (13.x) SP1 CU2

Sintaxe

sys.dm_db_stats_histogram (object_id, stats_id)  

Argumentos

object_id
É a ID do objeto no banco de dados atual para o qual as propriedades de uma de suas estatísticas é solicitada. object_id é int.

stats_id
É a ID de estatísticas do object_idespecificado. A ID de estatísticas pode ser obtida na exibição de gerenciamento dinâmico sys.stats . stats_id é int.

Tabela retornada

Nome da coluna Tipo de dados Descrição
object_id int ID do objeto (tabela ou exibição indexada) para o qual as propriedades do objeto de estatísticas serão retornadas.
stats_id int ID do objeto de estatísticas. É exclusiva na tabela ou exibição indexada. Para obter mais informações, veja sys.stats (Transact-SQL).
step_number int O número de etapas no histograma.
range_high_key sql_variant Valor da coluna associada superior de uma etapa do histograma. O valor da coluna também será denominado um valor de chave.
range_rows real Número estimado de linhas cujo valor de coluna fica dentro de uma etapa do histograma, excluindo-se o limite superior.
equal_rows real Número estimado de linhas cujo valor de coluna é igual ao limite superior da etapa do histograma.
distinct_range_rows bigint Número estimado de linhas com um valor de coluna distinto dentro de uma etapa do histograma, excluindo-se o limite superior.
average_range_rows real Número médio de linhas com valores de coluna duplicados em uma etapa do histograma, excluindo o limite superior (RANGE_ROWS / DISTINCT_RANGE_ROWS para DISTINCT_RANGE_ROWS > 0).

Comentários

O conjunto de resultados para sys.dm_db_stats_histogram retorna informações semelhantes a DBCC SHOW_STATISTICS WITH HISTOGRAM e também inclui object_id, stats_id e step_number.

Como a coluna range_high_key é um tipo de dados sql_variant, talvez seja necessário usar CAST ou CONVERT se um predicado fizer comparação com uma constante que não seja uma cadeia de caracteres.

Histograma

Um histograma mede a frequência de ocorrência de cada valor distinto em um conjunto de dados. O otimizador de consulta calcula um histograma com base nos valores de coluna na primeira coluna de chave do objeto de estatísticas, selecionando os valores de coluna por amostragem estatística das linhas ou pela execução de uma verificação completa de todas as linhas na tabela ou na exibição. Se o histograma for criado com base em um conjunto amostrado de linhas, os totais armazenados para o número de linhas e o número de valores distintos são estimativas e não precisam ser números inteiros.

Para criar o histograma, o otimizador de consulta classifica os valores de colunas, calcula o número de valores que correspondem a cada valor de coluna distinta e agrega os valores de colunas em um máximo de 200 etapas de histograma contíguas. Cada etapa inclui uma gama de valores de colunas seguidos por um valor de coluna associada superior. O intervalo inclui todos os possíveis valores de coluna entre valores de limite, excluindo-se os próprios valores de limite em si. O mais baixo dos valores de coluna classificados é o valor do limite superior da primeira etapa do histograma.

O diagrama a seguir mostra um histograma com seis etapas: A área à esquerda do primeiro valor do limite superior corresponde à primeira etapa.

Imagem de como um histograma é calculado por meio de amostras de valores de coluna.

Para cada etapa do histograma:

  • A linha em negrito representa o valor do limite superior (range_high_key) e o número de vezes que ele ocorre (equal_rows)

  • A área sólida à esquerda de range_high_key representa o intervalo de valores de coluna e o número médio de vezes que cada valor de coluna ocorre (average_range_rows). As average_range_rows da primeira etapa do histograma são sempre 0.

  • As linhas pontilhadas representam os valores amostrados usados para estimar o número total de valores distintos no intervalo (distinct_range_rows) e o número total de valores no intervalo (range_rows). O otimizador de consulta usa range_rows e distinct_range_rows para calcular average_range_rows e não armazena os valores amostrados.

O otimizador de consulta define as etapas do histograma de acordo com o significado estatístico delas. Ele usa um algoritmo de diferença máxima para minimizar o número de etapas no histograma, enquanto maximiza a diferença entre os valores de limite. O número máximo de etapas é 200. O número de etapas do histograma pode ser menor do que o número de valores distintos, até mesmo para colunas com menos de 200 pontos de limite. Por exemplo, uma coluna com 100 valores distintos pode ter um histograma com menos de 100 pontos de limite.

Permissões

Requer que o usuário tenha permissões selecionadas em colunas de estatísticas, que ele possua a tabela ou que seja membro da função de servidor fixa sysadmin, da função de banco de dados fixa db_owner ou da função de banco de dados fixa db_ddladmin.

Exemplos

a. Exemplo simples

O exemplo a seguir cria e preenche uma tabela simples. Em seguida, cria estatísticas na coluna Country_Name.

CREATE TABLE Country
(Country_ID int IDENTITY PRIMARY KEY,
Country_Name varchar(120) NOT NULL);
INSERT Country (Country_Name) VALUES ('Canada'), ('Denmark'), ('Iceland'), ('Peru');

CREATE STATISTICS Country_Stats  
    ON Country (Country_Name) ;  

A chave primária ocupa stat_id número 1, portanto, chame sys.dm_db_stats_histogram para stat_id número 2, para retornar o histograma de estatísticas da tabela Country.

SELECT * FROM sys.dm_db_stats_histogram(OBJECT_ID('Country'), 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:

O exemplo a seguir seleciona da tabela Country com um predicado na coluna Country_Name.

SELECT * FROM Country 
WHERE Country_Name = 'Canada';

O exemplo a seguir examina a estatística criada anteriormente na tabela Country e a coluna Country_Name para a etapa do histograma que corresponde ao predicado na consulta acima.

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 ss
INNER JOIN sys.stats_columns sc 
    ON ss.stats_id = sc.stats_id AND ss.object_id = sc.object_id
INNER JOIN sys.all_columns 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) shr
CROSS APPLY sys.dm_db_stats_histogram(ss.object_id, ss.stats_id) sh
WHERE ss.[object_id] = OBJECT_ID('Country') 
    AND ac.name = 'Country_Name'
    AND sh.range_high_key = CAST('Canada' AS CHAR(8));

Próximas etapas

DBCC SHOW_STATISTICS (Transact-SQL)
Funções e exibições de gerenciamento dinâmico relacionadas a objetos (Transact-SQL)
sys.dm_db_stats_properties (Transact-SQL)