sys.dm_db_xtp_hash_index_stats (Transact-SQL)

Aplica-se a: SQL ServerBanco de Dados SQL do Azure Instância Gerenciada de SQL do Azure

Essas estatísticas são úteis para entender e ajustar as contagens de buckets para índices de hash em tabelas com otimização de memória. Também pode ser usado para detectar os casos em que a chave de índice tem muitas duplicatas.

Um grande comprimento de cadeia média indica que várias linhas recebem o hash para o mesmo bucket. Isso pode acontecer porque:

  • Se o número de buckets vazios for baixo ou os comprimentos de cadeia média e máxima forem semelhantes, é provável que o número total de buckets seja muito baixo. Isso faz as chaves de índice diferentes receberem o hash para o mesmo bucket.

  • Se o número de baldes vazios for alto ou o comprimento máximo da cadeia for alto em relação ao comprimento médio da cadeia, há duas explicações prováveis. Há muitas linhas com valores de chave de índice duplicados ou há uma distorção nos valores de chave. Em ambos os casos, todas as linhas com o mesmo valor de chave de índice são hash para o mesmo bucket, levando a um comprimento de cadeia longo nesse bucket.

Os comprimentos de cadeia longos podem afetar significativamente o desempenho de todas as operações DML em linhas individuais, incluindo SELECT e INSERT. Os comprimentos de cadeias curtas com um número alto de buckets vazios estão na indicação de um bucket_count que seja muito alto. Isso diminui o desempenho de verificações de índice.

Aviso

Este DMV verifica toda a tabela. Portanto, se houver tabelas grandes em seu banco de dados, sys.dm_db_xtp_hash_index_stats pode levar muito tempo.

Para obter mais informações, consulte Índices de hash para tabelas com otimização de memória.

Nome da coluna Type Descrição
object_id int A ID de objeto da tabela pai.
xtp_object_id bigint ID da tabela com otimização de memória.
index_id int A ID do índice.
total_bucket_count bigint O número total de buckets de hash no índice.
empty_bucket_count bigint O número de bucket de hash vazio no índice.
avg_chain_length bigint O comprimento médio das cadeias de linha em todos os buckets de hash no índice.
max_chain_length bigint O comprimento máximo de cadeias de linha nos buckets de hash.
xtp_object_id bigint A ID do objeto OLTP in-memory que corresponde à tabela com otimização de memória.

Permissões

Requer a permissão VIEW DATABASE STATE no banco de dados.

Permissões do SQL Server 2022 e posteriores

Requer a permissão VIEW DATABASE PERFORMANCE STATE no banco de dados.

Exemplos

R. Solucionar problemas de contagem de buckets de índice de hash

A consulta a seguir pode ser usada para solucionar problemas da contagem de buckets de índice de hash de uma tabela existente. A consulta retorna estatísticas sobre a porcentagem de buckets vazios e o comprimento da cadeia para todos os índices de hash em tabelas de usuário.

  SELECT  
    QUOTENAME(SCHEMA_NAME(t.schema_id)) + N'.' + QUOTENAME(OBJECT_NAME(h.object_id)) as [table],   
    i.name                   as [index],   
    h.total_bucket_count,  
    h.empty_bucket_count,  
    FLOOR((  
      CAST(h.empty_bucket_count as float) /  
        h.total_bucket_count) * 100)  
                             as [empty_bucket_percent],  
    h.avg_chain_length,   
    h.max_chain_length  
  FROM sys.dm_db_xtp_hash_index_stats as h   
  INNER JOIN sys.indexes as i  
            ON h.object_id = i.object_id  
           AND h.index_id  = i.index_id  
    INNER JOIN sys.memory_optimized_tables_internal_attributes ia ON h.xtp_object_id=ia.xtp_object_id
    INNER JOIN sys.tables t on h.object_id=t.object_id
  WHERE ia.type=1
  ORDER BY [table], [index];  

Para obter detalhes sobre como interpretar os resultados dessa consulta, consulte Solução de problemas de índices de hash para tabelas com otimização de memória.

B. Estatísticas de índice de hash para tabelas internas

Determinados recursos usam tabelas internas que usam índices de hash, por exemplo, índices columnstore em tabelas com otimização de memória. A consulta a seguir retorna estatísticas para índices de hash em tabelas internas vinculadas a tabelas de usuário.

  SELECT  
    QUOTENAME(SCHEMA_NAME(t.schema_id)) + N'.' + QUOTENAME(OBJECT_NAME(h.object_id)) as [user_table],
    ia.type_desc as [internal_table_type],
    i.name                   as [index],   
    h.total_bucket_count,  
    h.empty_bucket_count,  
    h.avg_chain_length,   
    h.max_chain_length  
  FROM sys.dm_db_xtp_hash_index_stats as h   
  INNER JOIN sys.indexes as i  
            ON h.object_id = i.object_id  
           AND h.index_id  = i.index_id  
    INNER JOIN sys.memory_optimized_tables_internal_attributes ia ON h.xtp_object_id=ia.xtp_object_id
    INNER JOIN sys.tables t on h.object_id=t.object_id
  WHERE ia.type!=1
  ORDER BY [user_table], [internal_table_type], [index]; 

As contagens de bucket de índice em tabelas internas não podem ser alteradas, portanto, a saída dessa consulta deve ser considerada apenas informativa. Nenhuma ação é necessária.

Não se espera que essa consulta retorne nenhuma linha, a menos que você esteja usando um recurso que usa índices de hash em tabelas internas. A tabela com otimização de memória a seguir contém um índice columnstore. Depois de criar essa tabela, você verá índices de hash em tabelas internas.

  CREATE TABLE dbo.table_columnstore
  (
      c1 INT NOT NULL PRIMARY KEY NONCLUSTERED,
      INDEX ix_columnstore CLUSTERED COLUMNSTORE
  ) WITH (MEMORY_OPTIMIZED=ON);