sys.dm_db_xtp_hash_index_stats (Transact-SQL)

S’applique à :SQL ServerAzure SQL DatabaseAzure 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);