選択したインデックスの列に含まれる列よりも大きい一連の列をテーブルから選択する場合、必然的にクエリ プランでブックマーク ルックアップが発生します。ここで、クエリ プロセッサは、カバーされていない列を取得する必要があります。関連する非クラスター化インデックスのリーフ行からの参照 ID を使用して、クラスター化インデックスから。
私の経験では、ブックマーク ルックアップはクエリのパフォーマンスを大幅に低下させる可能性があります。これは、余分な読み取りが必要であり、クラスター化インデックスの各行を個別に解決する必要があるためです。これが、可能な限りカバーする NC インデックスを作成しようとする理由です。これは、必要なクエリ プランがよく知られている小さなテーブルの方が簡単ですが、任意のクエリが予想される多数の列を含む大きなテーブルがある場合、これはおそらくそうではありません。実現可能です。
これは、インデックスがカバーしている場合、またはブックマークルックアップのコストが軽減されるほど十分に小さいデータセットを選択している場合に、あらゆる種類の NC インデックスを使用した場合にのみ、費用対効果が得られることを意味します。実際、クエリオプティマイザーがすべての列が既に使用可能なクラスター化インデックス スキャンと比較して、コストが法外に高い場合は、インデックスを調べません。
したがって、インデックスが特定のクエリの結果を最適化することがわかっていない限り、インデックスを作成しても意味がありません。したがって、インデックスの値は、特定のテーブルに対して最適化できるクエリの割合に比例します。これは、実行中のクエリを分析することによってのみ決定できます。これは、まさにインデックス チューニング ウィザードが行うことです。
要約すると:
1) すべての列にインデックスを付けないでください。これは典型的な時期尚早の最適化です。考えられるすべてのクエリ プランのインデックスを含む大きなテーブルを事前に最適化することはできません。
2) インデックス チューニング ウィザードを使用してベース ワークロードを取得して実行するまで、どの列にもインデックスを作成しないでください。クエリのパフォーマンスに実際に役立つインデックスをウィザードが判断できるように、このワークロードはアプリケーションの使用パターンを代表するものである必要があります。