Partilhar via


sys.dm_db_stats_histogram (Transact-SQL)

Aplica-se a: SQL Server 2016 (13.x) e versões posteriores Azure SQL Database AzureSQL Managed InstanceSQL database in Microsoft Fabric

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

Observação

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

Sintaxe

sys.dm_db_stats_histogram (object_id , stats_id)

Arguments

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

O ID das estatísticas para o object_id especificado. O ID de estatísticas pode ser obtido a partir da visualização de gerenciamento dinâmico sys.stats . stats_id é int.

Tabela retornada

Nome da coluna Tipo de dados Description
object_id int ID do objeto (tabela ou exibição indexada) para o qual retornar as propriedades do objeto de estatísticas.
stats_id int ID do objeto de estatística. É exclusivo dentro da tabela ou do modo de exibição indexado. Para obter mais informações, consulte sys.stats.
step_number int O número de passos no histograma.
range_high_key sql_variant Valor da coluna de limite superior para uma etapa de histograma. O valor da coluna também é chamado de valor de chave.
range_rows reais Número estimado de linhas cujo valor de coluna está dentro de uma etapa de histograma, excluindo o limite superior.
equal_rows reais 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 de histograma, excluindo o limite superior.
average_range_rows reais Número médio de linhas com valores de coluna duplicados dentro de uma etapa de histograma, excluindo o limite superior (RANGE_ROWS / DISTINCT_RANGE_ROWS para DISTINCT_RANGE_ROWS > 0).

Observações

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 para cada valor distinto em um conjunto de dados. O otimizador de consulta calcula um histograma nos valores de coluna na primeira coluna chave do objeto de estatística, selecionando os valores de coluna por amostragem estatística das linhas ou executando uma verificação completa de todas as linhas na tabela ou exibição. Se o histograma for criado a partir de um conjunto amostrado de linhas, os totais armazenados para número de linhas e número de valores distintos são estimativas e não precisam ser inteiros.

Para criar o histograma, o otimizador de consulta classifica os valores de coluna, calcula o número de valores que correspondem a cada valor de coluna distinto e, em seguida, agrega os valores de coluna em um máximo de 200 etapas de histograma contíguas. Cada etapa inclui um intervalo de valores de coluna seguido por um valor de coluna de limite superior. O intervalo inclui todos os valores de coluna possíveis entre valores de fronteira, excluindo os próprios valores de limite. O menor dos valores de coluna classificada é o valor de limite superior para a primeira etapa do histograma.

O diagrama a seguir mostra um histograma com seis etapas. A área à esquerda do primeiro valor de limite superior é o primeiro passo.

Diagrama de como um histograma é calculado a partir de valores de coluna amostrados.

Para cada etapa do histograma:

  • A linha em negrito representa o valor limite superior (range_high_key) e o número de vezes que 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). O average_range_rows para a primeira etapa do histograma é sempre 0.

  • As linhas pontilhadas representam os valores amostrados utilizados 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 sua significância estatística. 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 passos é 200. O número de etapas do histograma pode ser menor do que o número de valores distintos, 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.

Permissions

Requer que o usuário tenha permissões de seleção em colunas de estatísticas ou que o usuário seja proprietário da tabela ou que o usuário 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 .

Examples

A. Exemplo básico

O exemplo a seguir cria e preenche uma tabela básica. Em seguida, cria estatísticas na Region_Name coluna.

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 o número 1, então chame sys.dm_db_stats_histogram o stat_id número 2, para retornar o histograma de estatísticas para a Region tabela.

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 a partir 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 na coluna Region_Name para a etapa do histograma correspondente 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));