欠落したインデックス機能の制限事項

欠落したインデックス機能には以下の制限があります。

  • インデックス作成の構成を微調整するためのものではありません。

  • 500 を超える欠落インデックス グループの統計情報を収集することはできません。

  • インデックス中で使用する列の順序を指定するものではありません。

  • 不等号の述語だけが関係するクエリでは、あまり正確でないコスト情報が返されます。

  • クエリによっては包含列だけが報告されるため、インデックスのキー列を手動で選択する必要があります。

  • インデックスが欠落している列に関して、未加工の情報だけを返します。

  • フィルター選択されたインデックスを推奨しません。

  • 欠落インデックス グループが XML プラン表示に複数回現れる場合、同じ欠落インデックス グループに対して異なるコストを返すことがあります。

  • 単純なクエリ プランは考慮されません。

以下に、これらの制限事項について詳しく説明します。

インデックス作成の構成の微調整

欠落したインデックス機能は、クエリのパフォーマンスを大幅に向上させる可能性がある、欠落したインデックスを見つけるための簡易ツールです。この機能を使用しても、インデックス作成の構成を微調整するのに適した情報は得られません。そのような目的には、データベース エンジン チューニング アドバイザーを使用してください。データベース エンジン チューニング アドバイザーの詳細については、「物理データベース デザインのチューニング」および「関連するクエリ チューニング機能」を参照してください。

欠落インデックス グループの最大数

統計情報は、最大 500 の欠落インデックス グループまで収集されます。このしきい値に達すると、欠落インデックス グループのデータはそれ以上収集されません。このしきい値は調整可能なパラメーターではないため変更できません。

インデックス列の順序

欠落したインデックス機能では、インデックスを推奨する際に、最適な並べ替え順序を考慮しません。次のようなサンプル クエリがあるとします。

SELECT column_a, column_b
FROM table_1
WHERE column_a < 10000
AND column_b < 10000
ORDER BY column_b, column_a

SELECT column_a, column_b
FROM table_1
WHERE column_a < 10000
AND column_b < 10000
ORDER BY column_b, column_a

欠落したインデックス機能によって、column_b よりも前に column_a のインデックスを作成することが推奨されますが、よりメリットが大きい並べ替え順序は、column_bcolumn_a の順です。この方が、クエリの並べ替え順序に一致します。データ定義言語 (DDL) ステートメントを作成して欠落したインデックスを実装する際には、個々のワークロード クエリを調べて最適な並べ替え順序を選んでください。CREATE INDEX ステートメント中で、欠落したインデックス機能の出力に基づいて列を並べ替える方法の詳細については、「欠落したインデックス情報を使用した CREATE INDEX ステートメントの記述」を参照してください。

不等号述語だけが関係するクエリ

欠落したインデックス機能では、不等号述語だけが関係するクエリのコスト情報を生成する際に、非常に単純なモデルを使用します。その結果、これらのクエリに対して返されるコスト情報は、等号が関係するクエリに対して返される情報よりも正確でない場合があります。等号述語を含んでいない次のようなクエリがあるとします。

SELECT *
FROM table_1
WHERE column_a > -1
AND column_b > -1

SELECT *
FROM table_1
WHERE column_a > -1
AND column_b > -1

このクエリ例には、不等号述語 (WHERE column_a > -1 AND column_b > -1) だけが含まれています。table_1 のすべての行が述語 column_a > -1 と column_b > -1 を満たすとします。その場合、欠落したインデックス機能は、column_acolumn_b の両方に対して誤ってインデックスを推奨する可能性があります。このとき、動的管理ビュー sys.dm_db_missing_indexes_group_stats によって報告される、関連影響値も正しくない可能性があります。

クエリによっては包含列だけを返す

この機能は、包含列に対する列の使用情報だけを報告する場合があります。たとえば、等号列 = { }、不等号列 = { }、および包含列 = {b, c, …} を報告する場合があります。この場合、包含列の 1 つがインデックス キー列として選ばれることになります。このような列の一部を対象にする他のクエリに対して返された、欠落したインデックス情報を使用して、インデックス キーに選ぶ包含列を決定できます。

未加工の情報だけを返す

欠落したインデックス機能は、インデックスが欠落している列に関する未加工の情報を返します。そのため、返される情報を使用してインデックスを作成する前に、追加の処理が必要な場合があります。

たとえば、関係する列が計算列の場合で、計算が非決定的または不正確な場合、その列に対する CREATE INDEX ステートメントは失敗します。不正確な計算の場合は、まず列を保存し、その後でインデックスを作成することができます。

XML プラン表示の同じ欠落インデックス グループに対して異なるコストが返される

欠落インデックス グループが XML プラン表示の中に複数回現れ、そのたびに異なるコストが報告される場合があります。これは、同じ欠落インデックス グループからの作用が、1 つのクエリの各部分によって異なる場合に起こります。

次のようなクエリがあるとします。

SELECT i.CustomerID, c.ModifiedDate, City
FROM NewIndividual i JOIN NewCustomer c ON i.CustomerID = c.CustomerID
                    AND c.CustomerType = 'I'
          JOIN NewCustomerAddress ca ON ca.CustomerID = c.CustomerID
          JOIN NewAddress a ON a.AddressID = ca.AddressID
WHERE i.CustomerID = 16701

SELECT i.CustomerID, c.ModifiedDate, City
FROM NewIndividual i JOIN NewCustomer c ON i.CustomerID = c.CustomerID
                    AND c.CustomerType = 'I'
          JOIN NewCustomerAddress ca ON ca.CustomerID = c.CustomerID
          JOIN NewAddress a ON a.AddressID = ca.AddressID
WHERE i.CustomerID = 16701

このクエリでは、CustomerID 列に対する 2 つの異なる結合条件によって、同じ欠落インデックス グループが 2 つ生成され、その中に、NewIndividual.CustomerID 列に対する同じインデックスが含まれる可能性があります。その場合、sys.dm_db_missing_index_groups 動的管理ビューには、欠落インデックス グループの 1 つの行だけが含まれます。しかし、XML プラン表示の出力には欠落インデックス グループが複数回現れ、結合条件ごとにコストが異なります。