sys.dm_db_missing_index_details (Transact-SQL)

適用対象:yesSQL Server (サポートされているすべてのバージョン) YesAzure SQL Database YesAzure 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_infosqlserver_start_time を使用します。

特定の欠落しているインデックスが含まれている不足しているインデックス グループを特定するには、列に基づいて動的管理ビューをsys.dm_db_missing_index_details等結合してクエリをindex_handle実行sys.dm_db_missing_index_groupsできます。

注意

この DMV の結果セットは 600 行に制限されています。 各行には、不足しているインデックスが 1 つ含まれています。 600 を超えるインデックスがない場合は、新しいインデックスを表示できるように、既存の不足しているインデックスに対処する必要があります。

CREATE INDEX ステートメントで不足しているインデックス情報を使用する

メモリ最適化インデックスとディスク ベースインデックスの両方の CREATE INDEX ステートメントに sys.dm_db_missing_index_details 返される情報を変換するには、等値列を非等値列の前に配置し、一緒にインデックスのキーを作成する必要があります。 付加列は、INCLUDE 句を使用して CREATE INDEX ステートメントに追加します。 等値の列の有効な順序を決定するには、選択度の最も高い列を左の先頭に指定し、選択度が高い順に並べます。 インデックス不足機能の制限など、 インデックス候補がない非クラスターインデックスのチューニングの詳細を確認します。

メモリ最適化インデックスの詳細については、「 Memory-Optimized テーブルのインデックス」を参照してください。

トランザクションの整合性

トランザクションでテーブルを作成または削除する場合、削除されたオブジェクトに関する欠落インデックス情報を含む行は、トランザクションの一貫性を保持するためこの動的管理オブジェクトから削除されます。 不足しているインデックス機能の制限について詳しくは、こちらをご覧ください。

アクセス許可

SQL Server と SQL Managed Instance では、VIEW SERVER STATE アクセス許可が必要です。

SQL Database BasicS0、および S1 のサービス目標、およびエラスティック プール内のデータベースの場合、サーバー管理者アカウント、Azure Active Directory 管理者アカウント、または ##MS_ServerStateReader##サーバー ロールのメンバーシップが必要です。 他のすべての SQL Database サービス目標では、データベースに対する VIEW DATABASE STATE アクセス許可または ##MS_ServerStateReader## サーバー ロールのメンバーシップのいずれかが必要です。

次の例では、現在のデータベースに不足しているインデックス候補を返します。 インデックス候補が見つからない場合は、可能な場合は互いに組み合わせ、現在のデータベース内の既存のインデックスと組み合わせる必要があります。 インデックス候補 が見つからない非クラスター化インデックスを調整して、これらの候補を適用する方法について説明します。

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 の場合は、自動インデックス チューニングの実装を検討してください。

次の手順

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