欠落したインデックス機能について

欠落したインデックス機能は、動的管理オブジェクトとプラン表示を使用して、SQL Server のクエリ パフォーマンスを向上させる欠落したインデックスについての情報を提供します。

コンポーネント

クエリ オプティマイザーは、クエリ プランを生成する際に、特定のフィルター条件に対する最適なインデックスを分析します。最適なインデックスが存在しないと、クエリ オプティマイザーは最適ではないクエリ プランを生成しますが、欠落している最適なインデックスについての情報はそのまま保存されます。欠落したインデックス機能では、これらのインデックスについての情報にアクセスし、インデックスを実装する必要があるかどうかを判断することができます。

欠落したインデックス機能は以下のコンポーネントで構成されます。

  • 一連の動的管理オブジェクト。このオブジェクトに対してクエリを実行すると、欠落したインデックスについての情報が返されます。

  • XML プラン表示の MissingIndexes 要素。この要素は、クエリ オプティマイザーが欠落していると判断したインデックスと、インデックスが欠落しているクエリを関連付けます。

欠落したインデックス機能の各コンポーネントについて、以下のセクションで詳しく説明します。

動的管理オブジェクト

SQL Server 上で一般的なワークロードを実行した後、次の表に示す動的管理オブジェクトに対してクエリを実行することで、欠落したインデックスについての情報を得ることができます。これらの動的管理オブジェクトは、master データベースに格納されます。

動的管理オブジェクト

返される情報

sys.dm_db_missing_index_group_stats (Transact-SQL)

ある欠落したインデックスのグループを実装することにより得られるパフォーマンス向上など、欠落インデックス グループに関する概要を返します。

sys.dm_db_missing_index_groups (Transact-SQL)

グループ識別子や、そのグループに含まれているすべての欠落したインデックスの識別子など、特定の欠落したインデックスのグループに関する情報を返します。

sys.dm_db_missing_index_details (Transact-SQL)

欠落したインデックスについての詳細情報を返します。たとえば、インデックスが欠落しているテーブルの名前や識別子、欠落したインデックスを構成する列や列の型などを返します。

sys.dm_db_missing_index_columns (Transact-SQL)

インデックスが欠落しているデータベース テーブルの列についての情報を返します。

これらの動的管理オブジェクトによって返される情報をツールまたはスクリプトで使用して、欠落したインデックスを実装する CREATE INDEX DDL ステートメントを生成することができます。

トランザクションの一貫性

これらの動的管理オブジェクトの各行に対する個々の変更は、トランザクション的に一貫性がありません。つまり、クエリが中止されたりクエリを含んでいるトランザクションがロールバックされても、そのクエリの欠落したインデックスについての情報が格納されている行は残ったままになります。

トランザクション全体だけがサポートされます。チェックポイントや部分ロールバックはサポートされていません。

注意

テーブルのメタデータが変更されると、そのテーブルに関するすべての欠落したインデックス情報はこれらの動的管理オブジェクトから削除されます。テーブルのメタデータは、たとえばテーブルに列を追加または削除したり、テーブルの列に対してインデックスを作成した場合に変更されます。

XML プラン表示の MissingIndexes 要素

動的管理オブジェクトの結果が示す欠落したインデックスとクエリを関連付けるには、XML プラン表示の MissingIndexes 要素を参照します。次の例に MissingIndexes 要素を示します。

<ShowPlanXML…>

 <BatchSequence>

  <Batch>

   <Statements>

    <StmtSimple…>

     <StatementSetOptions… />

      <QueryPlan…>

        <MissingIndexes>

        <MissingIndexGroup Impact="22.8764">

         <MissingIndex Database="[ADVENTUREWORKS2008R2]" Schema="[Person]" Table="[Address]">

          <ColumnGroup Usage="EQUALITY">

           <Column Name="[PostalCode]" ColumnId="4" />

          </ColumnGroup>

          <ColumnGroup Usage="INEQUALITY">

           <Column Name="[ModifiedDate]" ColumnId="5" />

          </ColumnGroup>

          <ColumnGroup Usage="INCLUDE">

           <Column Name="[AddressLine1]" ColumnId="2" />

           <Column Name="[AddressLine2]" ColumnId="3" />

           <Column Name="[StateProvinceID]" ColumnId="1" />

          </ColumnGroup>

         </MissingIndex>

        </MissingIndexGroup>

       </MissingIndexes>

MissingIndexes 要素に格納されている情報は、StmtSimple 要素で記述されている特定のクエリのパフォーマンスを向上させるインデックスを判断するのに役立ちます。StmtSimple 要素には、Transact-SQL ステートメント自体が含まれています。次に、この要素で返される情報を使用して、CREATE INDEX DDL ステートメントを記述することができます。

欠落したインデックス機能の有効化と無効化

欠落したインデックス機能は既定で有効になっています。この機能の有効と無効を切り替えたり、動的管理オブジェクトに対してクエリを実行するときに返されるテーブルをリセットするための制御方法は提供されていません。SQL Server を再起動すると、すべての欠落したインデックス情報は削除されます。

この機能を無効にする唯一の方法は、sqlservr コマンド プロンプト ユーティリティで -x 引数を使用して SQL Server のインスタンスを起動することです。詳細については、「sqlservr アプリケーション」を参照してください。