sys.dm_db_missing_index_group_stats_query (Transact-SQL)

適用対象:SQL Server 2019 (15.x) Azure SQL DatabaseAzure 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 SQL バッチでこのインデックスを必要とする最後のコンパイル済みステートメントのバッチまたは永続化オブジェクトのテキスト内で行が記述するクエリの開始位置をバイト単位で示します。
last_statement_end_offset int SQL バッチでこのインデックスを必要とする最後のコンパイル済みステートメントについて、行がバッチまたは永続化オブジェクトのテキスト内で記述するクエリの終了位置をバイト単位で示します。
last_statement_sql_handle varbinary(64) このインデックスを必要とする最後のコンパイル済みステートメントのバッチまたはストアド プロシージャを一意に識別するトークンです。 クエリ ストアによって使用されます。 とは異なりlast_sql_handle、 は、statement_sql_handleクエリ ストア カタログ ビュー sys.query_store_query_textによって使用される を参照します。 sys.query_store_query_text

クエリのコンパイル時にクエリ ストアが有効になっていない場合は、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_infosqlserver_start_time を使用します。 クエリ ストアを使用して、不足しているインデックスを保持することもできます。

注意

この 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; 

次のステップ

不足しているインデックス機能と関連する概念の詳細については、次の記事を参照してください。