sys.dm_db_xtp_hash_index_stats (Transact-SQL)
Aplica-se a: SQL Server Banco 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);
Conteúdo relacionado
- Introdução às tabelas com otimização de memória
- Exibições de gerenciamento dinâmico de tabela com otimização de memória
- Guia de arquitetura e design de índice SQL do SQL Server e do Azure: diretrizes de design de índice de hash
- Visão geral do OLTP in-memory e cenários de uso
- Solução de problemas de índices de hash para tabelas com otimização de memória
- Otimizar o desempenho usando tecnologias na memória no Banco de Dados SQL do Azure
- Otimizar o desempenho usando tecnologias na memória na Instância Gerenciada de SQL do Azure