sys.dm_db_xtp_hash_index_stats (Transact-SQL)

適用対象:データベース Azure SQL Managed Instance Azure SQL SQL Server (サポートされているすべてのバージョン)

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

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

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

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

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

警告

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

詳細については、「 Memory-Optimized テーブルのハッシュ インデックス」を参照してください。

列名 Type 説明
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 メモリ最適化テーブルに対応するIn-Memory OLTP オブジェクト ID。

アクセス許可

サーバーに対する VIEW DATABASE 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];  

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

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

内部テーブルのインデックスのBUCKET_COUNTは変更できないため、このクエリの出力は有益な情報のみを考慮する必要があります。 必要な操作はありません。

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

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

こちらもご覧ください

次の手順