sys.dm_db_missing_index_group_stats_query (Transact-SQL)
適用対象: SQL Server 2019 (15.x) Azure SQL Database Azure SQL Managed Instance
空間インデックスを除く、不足しているインデックスのグループから不足しているインデックスが必要なクエリに関する情報を返します。 不足しているインデックス グループごとに、複数のクエリが返される場合があります。 1 つの不足しているインデックス グループには、同じインデックスを必要とするクエリがいくつか存在する場合があります。
Azure SQL Database では、動的管理ビューでは、データベースの包含に影響する情報を公開したり、ユーザーがアクセスできる他のデータベースに関する情報を公開したりすることはできません。 この情報が公開されないようにするために、接続されているテナントに属していないデータを含む行はすべてフィルタリングされます。
列名 | データ型 | 説明 |
---|---|---|
group_handle | int | 不足しているインデックスのグループを識別します。 この識別子はサーバー内で一意です。 他の列は、グループ内のインデックスが欠落していると見なされるすべてのクエリに関する情報を提供します。 インデックス グループには、インデックスが 1 つだけ含まれます。 sys.dm_db_missing_index_groupsで index_group_handle に参加させることができます。 |
query_hash | binary(8) | クエリで計算され、同様のロジックを持つクエリを識別するために使用される、バイナリのハッシュ値です。 クエリ ハッシュを使用して、リテラル値だけが異なるクエリの全体的なリソース使用率を決定できます。 |
query_plan_hash | binary(8) | クエリ実行プランで計算され、同様のクエリ実行プランを識別するために使用される、バイナリのハッシュ値です。 クエリ プラン ハッシュを使用して、同様の実行プランを持つクエリの累積コストを確認できます。 ネイティブ コンパイル ストアド プロシージャがメモリ最適化テーブルに対してクエリを実行するときは、常に 0x000 になります。 |
last_sql_handle | varbinary(64) | このインデックスを必要とする最後にコンパイルされたステートメントのバッチまたはストアド プロシージャを一意に識別するトークンです。last_sql_handle は、動的管理機能sys.dm_exec_sql_textを呼び出すことによって、クエリの SQL テキストを取得するために使用できます。 |
last_statement_start_offset | int | 0 から始まるバイト単位で、SQL バッチでこのインデックスを必要とする最後のコンパイル済みステートメントのバッチまたは永続化オブジェクトのテキスト内で行が記述するクエリの開始位置を示します。 |
last_statement_end_offset | int | 0 から始まるバイト単位で、SQL バッチでこのインデックスを必要とする最後のコンパイル済みステートメントのバッチまたは永続化オブジェクトのテキスト内で行が記述するクエリの終了位置を示します。 |
last_statement_sql_handle | varbinary(64) | このインデックスを必要とする最後にコンパイルされたステートメントのバッチまたはストアド プロシージャを一意に識別するトークンです。 クエリ ストアによって使用されます。 last_sql_handle とは異なり、sys.query_store_query_text は、クエリ ストア カタログ ビュー sys.query_store_query_textで使用されるstatement_sql_handle を参照します。クエリのコンパイル時にクエリ ストアが有効になっていない場合は、0 を返します。 |
user_seeks | bigint | グループ内の推奨インデックスが使用された可能性があるユーザー クエリによって発生したシークの数。 |
user_scans | bigint | グループ内の推奨インデックスが使用されている可能性があるユーザー クエリによって発生するスキャンの数。 |
last_user_seek | datetime | グループ内の推奨インデックスが使用されている可能性があるユーザー クエリによって引き起こされる最後のシークの日時。 |
last_user_scan | datetime | グループ内の推奨インデックスを使用できたユーザー クエリによって発生した前回のスキャンの日時。 |
avg_total_user_cost | float | グループ内のインデックスによって削減できたユーザー クエリの平均コスト。 |
avg_user_impact | float | この欠落インデックス グループが実装されていた場合のユーザー クエリへの効果の平均パーセンテージ (%)。 この値は、この不足しているインデックス グループが実装されている場合、クエリ コストがこの割合で平均低下することを意味します。 |
system_seeks | bigint | グループ内の推奨インデックスを使用できたシステム クエリ (Auto Stats クエリなど) によって発生したシーク数。 詳細については、「 Auto Stats イベント クラスを参照してください。 |
system_scans | bigint | グループ内の推奨インデックスを使用できたシステム クエリによって発生したスキャン数。 |
last_system_seek | datetime | グループ内の推奨インデックスが使用されている可能性があるシステム クエリによって引き起こされる、最後のシステム シークの日時。 |
last_system_scan | datetime | グループ内の推奨インデックスが使用されている可能性があるシステム クエリによって引き起こされた、最後のシステム スキャンの日時。 |
avg_total_system_cost | float | グループ内のインデックスによって削減できるシステム クエリの平均コスト。 |
avg_system_impact | float | この不足しているインデックス グループが実装された場合にシステム クエリで発生する可能性がある平均パーセンテージの利点。 この値は、この不足しているインデックス グループが実装されている場合、クエリ コストがこの割合で平均低下することを意味します。 |
解説
sys.dm_db_missing_index_group_stats_query
によって返される情報は、すべてのクエリのコンパイルまたは再コンパイルではなく、すべてのクエリ実行によって更新されます。 使用状況の統計情報は保持されず、データベース エンジンが再起動されるまでのみ保持されます。
データベース管理者は、サーバーのリサイクル後に使用状況の統計情報を保持する場合は、不足しているインデックス情報のバックアップ コピーを定期的に作成する必要があります。 データベース エンジンが最後に起動された時刻を調べるには、sys.dm_os_sys_info の sqlserver_start_time
を使用します。 また、クエリ ストアを使用して、不足しているインデックスをすることもできます。
Note
この DMV の結果セットは 600 行に制限されています。 各行には、不足しているインデックスが 1 つ含まれています。 不足しているインデックスが 600 個を超える場合は、新しいインデックスを表示できるように、既存の不足しているインデックスに対処する必要があります。
アクセス許可
この動的管理ビューに対してクエリを実行するには、ユーザーに VIEW SERVER STATE 権限または VIEW SERVER STATE 権限を意味する権限を付与する必要があります。
SQL Server 2022 以降でのアクセス許可
サーバーに対する VIEW SERVER PERFORMANCE STATE アクセス許可が必要です。
例
次の例は、 sys.dm_db_missing_index_group_stats_query
動的管理ビューの使用方法を示しています。
A. ユーザー クエリで予想される上位 10 件の改善点について、最新のクエリ テキストを検索する
次のクエリは、予想される累積改善が最も高くなる 10 個の不足しているインデックスについて、最後に記録されたクエリ テキストを降順で返します。
SELECT TOP 10
SUBSTRING
(
sql_text.text,
misq.last_statement_start_offset / 2 + 1,
(
CASE misq.last_statement_start_offset
WHEN -1 THEN DATALENGTH(sql_text.text)
ELSE misq.last_statement_end_offset
END - misq.last_statement_start_offset
) / 2 + 1
),
misq.*
FROM sys.dm_db_missing_index_group_stats_query AS misq
CROSS APPLY sys.dm_exec_sql_text(misq.last_sql_handle) AS sql_text
ORDER BY misq.avg_total_user_cost * misq.avg_user_impact * (misq.user_seeks + misq.user_scans) DESC;
次のステップ
不足しているインデックス機能と関連する概念の詳細については、次の記事を参照してください。
- インデックスの候補が見つからない、クラスター化されていないインデックスを調整する
- sys.dm_db_missing_index_columns (Transact-SQL)
- sys.dm_db_missing_index_details (Transact-SQL)
- sys.dm_db_missing_index_groups (Transact-SQL)
- sys.dm_db_missing_index_group_stats (Transact-SQL)
- sys.dm_exec_sql_text (Transact-SQL)
- CREATE INDEX (Transact-SQL)
- sys.dm_os_sys_info (Transact-SQL)
- クエリ ストア