Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Aplica-se a: SQL Server 2016 (13.x) e versões
posteriores Azure SQL Database
Azure SQL Managed Instance
SQL database in Microsoft Fabric
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 são solicitadas. object_id é int.
stats_id
A ID das estatísticas do object_id especificado. 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, consulte sys.stats. |
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 de 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 a partir de um conjunto de linhas amostrado, os totais armazenados para o número de linhas e o número de valores distintos serão estimativas e não precisarão ser 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 de seleção em colunas de estatísticas ou o usuário seja proprietário da tabela ou o usuário seja membro da função de servidor fixa sysadmin , da função de banco de dados fixa db_owner ou da db_ddladmin função de banco de dados fixa.
Exemplos
a. Exemplo básico
O exemplo a seguir cria e preenche uma tabela básica. Em seguida, cria estatísticas na coluna 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);
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 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
O exemplo a seguir seleciona da tabela Region com um predicado na coluna Region_Name.
SELECT * FROM Region
WHERE Region_Name = 'Canada';
O exemplo a seguir examina a estatística criada anteriormente na tabela Region e a coluna Region_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 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));