sys.dm_db_xtp_hash_index_stats (Transact-SQL)

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

これらの統計は、メモリ最適化テーブルのハッシュ インデックスのバケット数を理解して調整するのに役立ちます。 また、インデックス キーに多数の重複があるケースを検出するためにも使用できます。

平均チェーン長が大きい場合は、多数の行が同じバケットにハッシュされていることを示します。 これは、次の理由で発生する可能性があります。

  • 空のバケットの数が少ない場合、または平均と最大チェーンの長さが似ている場合は、バケットの合計数が少なすぎる可能性があります。 これにより、多数の異なるインデックス キーが同じバケットにハッシュされます。

  • 空のバケットの数が多い場合、または平均チェーン長に対して最大チェーン長が高い場合は、2 つの説明が存在する可能性があります。 インデックス キー値が重複する行が多数存在するか、キー値に偏りがあります。 どちらの場合も、同じインデックス キー値ハッシュを持つすべての行が同じバケットにハッシュされ、そのバケット内のチェーンの長さが長くなります。

チェーンの長さが長いと、個々の行に対するすべての DML 操作のパフォーマンスに大きな影響を与INSERTえるSELECT可能性があります。 チェーンの長さが短く、空のバケット数が多いことは、bucket_count の値が高すぎることを意味します。 これにより、インデックス スキャンのパフォーマンスが低下します。

警告

この DMV はテーブル全体をスキャンします。 そのため、データベースに大きなテーブルがある場合は、 sys.dm_db_xtp_hash_index_stats 実行に時間がかかる場合があります。

詳細については、「メモリ最適化テーブルのハッシュ インデックス」を参照してください

列名 種類 説明
object_id int 親テーブルのオブジェクト ID。
xtp_object_id bigint メモリ最適化テーブルの ID。
index_id int インデックス ID。
total_bucket_count bigint インデックス内のハッシュ バケットの総数。
empty_bucket_count bigint インデックス内の空のハッシュ バケットの数。
avg_chain_length bigint インデックス内のすべてのハッシュ バケットに対する行チェーンの平均長。
max_chain_length bigint ハッシュ バケット内の行チェーンの最大長。
xtp_object_id bigint メモリ最適化テーブルに対応するインメモリ OLTP オブジェクト ID。

アクセス許可

データベースに対する VIEW DATABA Standard Edition STATE 権限が必要です。

SQL Server 2022 以降でのアクセス許可

データベースに対する VIEW DATABASE PERFORMANCE STATE アクセス許可が必要です。

A. ハッシュ インデックスバケット数のトラブルシューティング

次のクエリを使用して、既存のテーブルのハッシュ インデックス バケット数のトラブルシューティングを行うことができます。 このクエリは、ユーザー テーブルのすべてのハッシュ インデックスに対する空のバケットの割合とチェーンの長さに関する統計情報を返します。

  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];  

このクエリの結果を解釈する方法の詳細については、「メモリ最適化テーブルのハッシュ インデックスのトラブルシューティング」を参照してください

B. 内部テーブルのハッシュ インデックス統計

一部の機能では、メモリ最適化テーブルの列ストア インデックスなど、ハッシュ インデックスを使用する内部テーブルが使用されます。 次のクエリは、ユーザー テーブルにリンクされている内部テーブルのハッシュ インデックスの統計を返します。

  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]; 

内部テーブルのインデックスのバケット数は変更できないため、このクエリの出力は情報提供のみを考慮する必要があります。 必要なアクションはありません。

内部テーブルでハッシュ インデックスを使用する機能を使用している場合を除き、このクエリは行を返しません。 次のメモリ最適化テーブルには、列ストア インデックスが含まれています。 このテーブルを作成すると、内部テーブルにハッシュ インデックスが表示されます。

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