sys.dm_db_xtp_hash_index_stats (Transact-SQL)
S’applique à : SQL ServerAzure SQL Database Azure SQL Managed Instance
Ces statistiques sont utiles pour comprendre et régler le nombre de compartiments pour les index de hachage dans les tables optimisées en mémoire. Elles peuvent également être utilisées pour détecter les cas où la clé d'index possède un grand nombre de doublons.
Une longueur de chaîne moyenne élevée indique que de nombreuses lignes sont hachées dans le même compartiments. Cela peut se produire si :
Le nombre de compartiments vides est faible ou les longueurs de chaîne moyenne et maximale sont similaires. Il est probable que le nombre de compartiments est trop bas. Cela entraîne le hachage de plusieurs clés d'index dans le même compartiment.
Si le nombre de compartiments vides est élevé ou si la longueur maximale de la chaîne est élevée par rapport à la longueur moyenne de la chaîne, il existe deux explications probables. Il existe de nombreuses lignes avec des valeurs de clé d’index en double, ou il existe une asymétrie dans les valeurs de clé. Dans les deux cas, toutes les lignes avec le même hachage de clé d’index sur le même compartiment, entraînant une longueur de chaîne longue dans ce compartiment.
Les longueurs de chaîne longues peuvent affecter considérablement les performances de toutes les opérations DML sur des lignes individuelles, y compris SELECT
et INSERT
. Les chaînes de type Short avec un nombre de compartiments vides élevé sont une indication de bucket_count trop élevé. Cela altère les performances des analyses d'index.
Avertissement
Cette vue de gestion dynamique analyse l’intégralité de la table. Par conséquent, s’il existe de grandes tables dans votre base de données, sys.dm_db_xtp_hash_index_stats
cela peut prendre beaucoup de temps.
Pour plus d’informations, consultez Index de hachage pour les tables mémoire optimisées.
Nom de la colonne | Type | Description |
---|---|---|
object_id | int | ID d'objet d'une table parent. |
xtp_object_id | bigint | ID de la table optimisée en mémoire. |
index_id | int | ID d'index. |
total_bucket_count | bigint | Nombre total de compartiments de hachage dans l'index. |
empty_bucket_count | bigint | Nombre total de compartiments de hachage vides dans l'index. |
avg_chain_length | bigint | Longueur moyenne des chaînes de ligne sur tous les compartiments de hachage dans l'index. |
max_chain_length | bigint | Longueur maximale des chaînes de ligne dans les compartiments de hachage. |
xtp_object_id | bigint | ID d’objet OLTP en mémoire qui correspond à la table optimisée en mémoire. |
autorisations
Requiert l'autorisation VIEW DATABASE STATE sur la base de données.
Autorisations pour SQL Server 2022 (et versions plus récentes)
Nécessite l’autorisation VIEW DATABASE PERFORMANCE STATE sur la base de données.
Exemples
R. Résoudre les problèmes liés au nombre de compartiments d’index de hachage
La requête suivante peut être utilisée pour résoudre les problèmes liés au nombre de compartiments d’index de hachage d’une table existante. La requête retourne des statistiques sur le pourcentage de compartiments vides et de longueur de chaîne pour tous les index de hachage sur les tables utilisateur.
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];
Pour plus d’informations sur l’interprétation des résultats de cette requête, consultez Résolution des problèmes d’index de hachage pour les tables mémoire optimisées.
B. Statistiques d’index de hachage pour les tables internes
Certaines fonctionnalités utilisent des tables internes qui utilisent des index de hachage, par exemple des index columnstore sur des tables optimisées en mémoire. La requête suivante retourne des statistiques pour les index de hachage sur les tables internes liées aux tables utilisateur.
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];
Le nombre de compartiments d’index sur les tables internes ne peut pas être modifié. La sortie de cette requête doit donc être considérée comme informative uniquement. Aucune action n’est requise.
Cette requête n’est pas censée retourner de lignes, sauf si vous utilisez une fonctionnalité qui utilise des index de hachage sur des tables internes. La table mémoire optimisée suivante contient un index columnstore. Après avoir créé cette table, vous verrez des index de hachage sur des tables internes.
CREATE TABLE dbo.table_columnstore
(
c1 INT NOT NULL PRIMARY KEY NONCLUSTERED,
INDEX ix_columnstore CLUSTERED COLUMNSTORE
) WITH (MEMORY_OPTIMIZED=ON);
Contenu connexe
- Introduction aux tables optimisées en mémoire
- Vues de gestion dynamique de table optimisées en mémoire
- Guide de conception et d’architecture d’index SQL Server et Azure SQL : instructions de conception d’index de hachage
- Vue d’ensemble et scénarios d’utilisation OLTP en mémoire
- Résolution des problèmes des index de hachage pour les tables à mémoire optimisée
- Optimiser les performances à l’aide de technologies en mémoire dans Azure SQL Database
- Optimiser les performances à l’aide de technologies en mémoire dans Azure SQL Managed Instance