Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Aplica-se a:SQL Server
Banco de Dados SQL do Azure
Instâ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);
Conteúdo relacionado
- Introdução às tabelas Memory-Optimized
- Memory-Optimized Vistas de Gestão Dinâmica da Tabela
- SQL Server e guia de arquitetura e design de índices SQL SQL: Diretrizes de design de índices de hash
- In-Memory Visão Geral e Cenários de Utilização OLTP
- Resolução de Problemas de Índices de Hash para Tabelas Memory-Optimized
- Otimizar o desempenho usando tecnologias na memória no Banco de Dados SQL do Azure
- Otimizar o desempenho usando tecnologias na memória no Azure SQL Managed Instance