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.
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)