次の方法で共有


sys.dm_db_missing_index_group_stats_query(Transact-SQL)

適用対象: Sql Server 2019 (15.x) 以降のバージョン Azure SQL DatabaseAzure SQL Managed InstanceSql データベース

空間インデックスを除く、不足しているインデックスのグループから不足しているインデックスが必要なクエリに関する情報を返します。 欠損したインデックスグループごとに複数のクエリが返されることがあります。 欠けているインデックスグループには、同じインデックスを必要とする複数のクエリが存在することもあります。

Azure SQL Databaseでは、動的管理ビューはデータベースの包含に影響を与える情報を公開したり、ユーザーがアクセスできる他のデータベースの情報を公開したりできません。 この情報が公開されないようにするために、接続されているテナントに属していないデータを含む行はすべてフィルタリングされます。

列名 データ型 説明
group_handle int 不足しているインデックスのグループを識別します。 この識別子はサーバー内で一意です。

他の列は、グループ内のインデックスが欠落していると見なされるすべてのクエリに関する情報を提供します。

インデックス グループには、インデックスが 1 つだけ含まれます。

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は、クエリ ストア カタログ ビュー statement_sql_handleで使用されるを参照します。

クエリがコンパイルされたときにQuery Storeが有効になっていなければ、リターン 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によって返される情報は、すべてのクエリのコンパイルまたは再コンパイルではなく、すべてのクエリ実行によって更新されます。 使用統計は永続化されず、データベースエンジンが再起動されるまで保持されます。

データベース管理者は、サーバーのリサイクル後に使用状況の統計情報を保持する場合は、不足しているインデックス情報のバックアップ コピーを定期的に作成する必要があります。 データベース エンジンが最後に起動された時刻を調べるには、sqlserver_start_time を使用します。 また、クエリ ストアを使用して、不足しているインデックスをすることもできます。

アクセス許可

この動的管理ビューをクエリするには、SQL Server 2019(15.x)以前のバージョンに対して、 VIEW SERVER STATE 権限または VIEW SERVER STATE 権限を示唆する権限がユーザーに付与される必要があります。

SQL Server 2022(16.x)以降のバージョンでは、サーバー上で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;