Partilhar via


sys.dm_db_xtp_hash_index_stats (Transact-SQL)

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

Estas estatísticas são úteis para compreender e ajustar as contagens de baldes para índices de hash em tabelas otimizadas para memória. Também pode ser usado para detetar casos em que a chave de índice tem muitos duplicados.

Um comprimento médio grande da cadeia indica que muitas linhas são hashadas para o mesmo bucket. Isto pode acontecer porque:

  • Se o número de baldes vazios for baixo ou os comprimentos médios e máximos das cadeias forem semelhantes, é provável que o número total de baldes seja demasiado baixo. Isto faz com que muitas chaves de índice diferentes sejam hash para o mesmo bucket.

  • Se o número de baldes vazios for elevado, ou se o comprimento máximo da cadeia for elevado em relação ao comprimento médio da cadeia, há duas explicações prováveis. Existem muitas linhas com valores de chave de índice duplicados, ou há um desvio nos valores das chaves. Em qualquer dos 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.

Longos comprimentos de cadeia podem afetar significativamente o desempenho de todas as operações DML em linhas individuais, incluindo SELECT e INSERT. Comprimentos curtos das cadeias juntamente com um elevado número de baldes vazios indicam um bucket_count demasiado elevado. Isto diminui o desempenho das varreduras de índice.

Advertência

Este IMT digitaliza toda a mesa. Portanto, se houver tabelas grandes na sua base de dados, sys.dm_db_xtp_hash_index_stats pode demorar muito tempo.

Para mais informações, consulte Índices de Hash para Memory-Optimized Tabelas.

Nome da coluna Tipo Description
object_id int O ID do objeto da tabela pai.
xtp_object_id bigint ID da tabela otimizada para memória.
index_id int O 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 baldes de hash vazios no índice.
avg_chain_length bigint O comprimento médio das cadeias de linhas sobre todos os buckets de hash no índice.
max_chain_length bigint O comprimento máximo das cadeias de linhas nos buckets de hash.
xtp_object_id bigint O In-Memory ID de objeto OLTP que corresponde à tabela otimizada para memória.

Permissions

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

Permissões para SQL Server 2022 e posterior

É necessária a permissão VIEW DATABASE PERFORMANCE STATE no banco de dados.

Examples

A. Resolução de problemas na contagem de buckets do índice de hash

A consulta seguinte pode ser usada para diagnosticar a contagem de buckets do índice de hash de uma tabela existente. A consulta devolve estatísticas sobre a percentagem de baldes vazios e o comprimento da cadeia para todos os índices de hash nas tabelas de utilizador.

  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 detalhes sobre como interpretar os resultados desta consulta, veja Resolução de Problemas de Índices de Hash para Tabelas Memory-Optimized.

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

Certas funcionalidades usam tabelas internas que usam índices de hash, por exemplo, índices de coluna em tabelas otimizadas para memória. A consulta seguinte retorna estatísticas para índices de hash em tabelas internas que estão ligadas às tabelas de utilizador.

  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 baldes do índice nas tabelas internas não podem ser alteradas, pelo que o resultado desta consulta deve ser considerado apenas informativo. Não é necessária qualquer ação.

Esta consulta não deverá devolver linhas a menos que esteja a usar uma funcionalidade que utilize índices de hash em tabelas internas. A tabela seguinte otimizada para memória contém um índice de columnstore. Depois de criar esta tabela, verá índices de hash nas tabelas internas.

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