sys.dm_db_xtp_hash_index_stats (Transact-SQL)
適用対象: SQL Server Azure SQL Database Azure SQL Managed Instance
これらの統計は、メモリ最適化テーブル内のインデックスを のバケット数を理解して調整する場合に役立ちます。 また、インデックス キーに多数の重複があるケースを検出するためにも使用できます。
平均チェーン長が大きい場合は、多数の行が同じバケットにハッシュされていることを示します。 これは、次の理由で発生する可能性があります。
空のバケットの数が少ない場合、または平均と最大チェーンの長さが似ている場合は、バケットの合計数が少なすぎる可能性があります。 これにより、多数の異なるインデックス キーが同じバケットにハッシュされます。
空のバケットの数が多い場合、または平均チェーン長に対して最大チェーン長が高い場合は、2 つの説明が存在する可能性があります。 インデックス キー値が重複する行が多数存在するか、キー値に偏りがあります。 どちらの場合も、同じインデックス キー値ハッシュを持つすべての行が同じバケットにハッシュされ、そのバケット内のチェーンの長さが長くなります。
チェーンの長さが長いと、 SELECT
や INSERT
を含め、個々の行に対するすべての DML 操作のパフォーマンスに大きな影響を与える可能性があります。 チェーンの長さが短く、空のバケット数が多いことは、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 DATABASE 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);