sys.dm_db_missing_index_details (Transact-SQL)
適用対象:SQL Server
Azure SQL Database
Azure SQL Managed Instance
不足しているインデックスに関する詳細情報を返します。
Azure SQL Database では、動的管理ビューは、データベースの包含に影響を与える情報を公開したり、ユーザーがアクセスできる他のデータベースに関する情報を公開したりすることはできません。 この情報が公開されないようにするために、接続されているテナントに属していないデータを含むすべての行が除外されます。
列名 | データ型 | 説明 |
---|---|---|
index_handle | int | 特定の欠落インデックスの識別子。 識別子はサーバー全体で一意です。 index_handle は、このテーブルのキーです。 |
database_id | smallint | 欠落インデックスを含むテーブルがあるデータベースの識別子。 |
object_id | int | インデックスが欠落しているテーブルの識別子。 |
equality_columns | nvarchar (4000) | 次の形式の等値述語に使用できる列のコンマ区切り一覧。 table.column = constant_value |
inequality_columns | nvarchar (4000) | 次の形式のような不等値述語に使用できる列のコンマ区切り一覧。 table.column>constant_value "=" 以外の比較演算子はすべて、不等値を表します。 |
included_columns | nvarchar (4000) | クエリの包括列として必要な列のコンマ区切り一覧。 カバー列または含まれている列の詳細については、「含まれる列 を使用してインデックスを作成する」を参照してください。 メモリ最適化インデックス (ハッシュとメモリ最適化非クラスター化の両方) の場合は、 を無視します included_columns 。 テーブルのすべての列は、すべてのメモリ最適化インデックスに含まれます。 |
statement | nvarchar (4000) | インデックスが欠落しているテーブルの名前。 |
注釈
によって sys.dm_db_missing_index_details
返される情報は、クエリがクエリ オプティマイザーによって最適化され、永続化されない場合に更新されます。 不足しているインデックス情報は、データベース エンジンが再起動されるまでのみ保持されます。 欠落インデックスの情報を、サーバーの再利用後も保持する場合は、データベース管理者が情報のバックアップ コピーを定期的に作成する必要があります。 データベース エンジンが最後に起動された時刻を調べるには、sys.dm_os_sys_info の sqlserver_start_time
を使用します。
特定の欠落しているインデックスが含まれている不足しているインデックス グループを特定するには、列に基づいて 動的管理ビューを とsys.dm_db_missing_index_details
等結合してクエリをindex_handle
実行sys.dm_db_missing_index_groups
できます。
注意
この DMV の結果セットは 600 行に制限されています。 各行には、不足しているインデックスが 1 つ含まれています。 不足しているインデックスが 600 個を超える場合は、新しいインデックスを表示できるように、既存の不足しているインデックスに対処する必要があります。
CREATE INDEX ステートメントで不足しているインデックス情報を使用する
によって sys.dm_db_missing_index_details
返された情報を、メモリ最適化インデックスとディスク ベースインデックスの両方の CREATE INDEX ステートメントに変換するには、等値列を非等値列の前に配置し、一緒にインデックスのキーを作成する必要があります。 付加列は、INCLUDE 句を使用して CREATE INDEX ステートメントに追加します。 等値の列の有効な順序を決定するには、選択度の最も高い列を左の先頭に指定し、選択度が高い順に並べます。 詳細については、「 欠落しているインデックス機能の制限事項など、インデックス候補がない非クラスター化 インデックスをチューニングする」を参照してください。
メモリ最適化インデックスの詳細については、「 Memory-Optimized テーブルのインデックス」を参照してください。
トランザクションの整合性
トランザクションでテーブルを作成または削除する場合、削除されたオブジェクトに関する欠落インデックス情報を含む行は、トランザクションの一貫性を保持するためこの動的管理オブジェクトから削除されます。 不足しているインデックス機能の制限事項の詳細を確認してください。
アクセス許可
SQL Server と SQL Managed Instance では、VIEW SERVER STATE
アクセス許可が必要です。
SQL Database Basic、S0、および S1 のサービス目標、およびエラスティック プール内のデータベースの場合、サーバー管理者アカウント、Azure Active Directory 管理者アカウント、または ##MS_ServerStateReader##
サーバー ロールのメンバーシップが必要です。 他のすべての SQL Database サービス目標では、データベースに対する VIEW DATABASE STATE
アクセス許可または ##MS_ServerStateReader##
サーバー ロールのメンバーシップのいずれかが必要です。
SQL Server 2022 以降のアクセス許可
サーバーに対する VIEW SERVER PERFORMANCE STATE 権限が必要です。
例
次の例では、現在のデータベースに対して不足しているインデックス候補が返されます。 不足しているインデックス候補は、可能な限り、互いに結合し、現在のデータベース内の既存のインデックスと組み合わせる必要があります。 これらの候補を適用して、インデックス候補 が見つからない非クラスター化インデックスを調整する方法について説明します。
SELECT
CONVERT (varchar(30), getdate(), 126) AS runtime, mig.index_group_handle, mid.index_handle,
CONVERT (decimal (28, 1), migs.avg_total_user_cost * migs.avg_user_impact * (migs.user_seeks + migs.user_scans) ) AS improvement_measure,
'CREATE INDEX missing_index_' + CONVERT (varchar, mig.index_group_handle) + '_' + CONVERT (varchar, mid.index_handle) + ' ON ' + mid.statement + ' (' + ISNULL (mid.equality_columns, '') + CASE
WHEN mid.equality_columns IS NOT NULL
AND mid.inequality_columns IS NOT NULL THEN ','
ELSE ''
END + ISNULL (mid.inequality_columns, '') + ')' + ISNULL (' INCLUDE (' + mid.included_columns + ')', '') AS create_index_statement,
migs.*, mid.database_id, mid.[object_id]
FROM sys.dm_db_missing_index_groups mig
INNER JOIN sys.dm_db_missing_index_group_stats migs ON migs.group_handle = mig.index_group_handle
INNER JOIN sys.dm_db_missing_index_details mid ON mig.index_handle = mid.index_handle
WHERE CONVERT (decimal (28, 1),migs.avg_total_user_cost * migs.avg_user_impact * (migs.user_seeks + migs.user_scans)) > 10
ORDER BY migs.avg_total_user_cost * migs.avg_user_impact * (migs.user_seeks + migs.user_scans) DESC
注意
Microsoft の Tiger ツールボックスの Index-Creation スクリプトでは、不足しているインデックス DMV を調べ、冗長なインデックス候補を自動的に削除し、影響の少ないインデックスを解析して、確認用のインデックス作成スクリプトを生成します。 上記のクエリと同様に、インデックス作成コマンドは実行されません。 インデックス作成スクリプトは、SQL ServerとAzure SQL Managed Instanceに適しています。 Azure SQL Database の場合は、自動インデックス チューニングの実装を検討してください。
次のステップ
不足しているインデックス機能の詳細については、次の記事を参照してください。