SQL Server 2005には、クラスタ化されていないキーを使用してレコードを選択する必要がある大きなテーブルがあり、できるだけこのプロセスを最適化しようとしています。一貫性のないSQL Server実行計画のキー参照
テーブルにはかなりの数の列があり、3つの異なる列に非クラスター化インデックスを追加しました。
SELECT * FROM table WHERE Field1 = 10;
SELECT * FROM table WHERE Field2 = 40;
SELECT * FROM table WHERE Field3 = 'A';
Field1とField2は整数フィールド、Field3はvarcharです。
SELECT -> Nested Loop -> Index Seek
-> Key Lookup
しかし、私はその実行時間が大幅に矛盾していることを見つける:私はこれらの3件の問い合わせのためのSQL Serverからの推定クエリ実行プランを要求すると
は、私はそれぞれのために基本的に同じプランを取得します。具体的には、2番目のクエリはクエリの合計コストの98%を占めます。 Key LookupのステップがIndex Seekと比較して100%のコストを有することを除いて、その実行計画は他のものと同じです。他の2つのクエリでは、50%に近くなります。
Key Lookupは望ましくないことを理解しており、余分な列を参照する必要がないように列にインデックスを追加することで回避できます。しかし、この場合、テーブル内のすべての列が返されるようにして、それらをすべてインデックスに追加するのは意味がありません。しかし、どのようにして1つの索引でKey Lookup操作に別のKey Lookupよりも時間がかかるのですか?