sys.dm_db_xtp_hash_index_stats(Transact-SQL)

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

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

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

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

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

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

Warning

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

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

列名 タイプ Description
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。

Permissions

データベース VIEWDATABASE STATE許可が必要です。

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

データベース VIEWDATABASE パフォーマンス状態の許可が必要です。

Examples

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