最適化しようとしている中程度に複雑なクエリのTOP n
場合、句を削除すると実行プランが変更されることに気付きました。クエリにTOP n
データベースエンジンが含まれている場合、TOP
句を無視してクエリを実行し、最後にその結果セットを要求されたn行まで縮小するだけだと思いました。グラフィカルな実行計画は、これが事実であることを示しているようです- TOP
「最後の」ステップです。しかし、さらに進んでいるようです。
私の質問は、TOP n句がクエリの実行計画にどのように(そしてなぜ)影響するかです。
これは私の場合に起こっていることの単純化されたバージョンです:
クエリは、AとBの2つのテーブルの行を照合しています。
TOP
句がない場合、オプティマイザは、テーブルAから19k行、テーブルBから46k行があると推定します。返される実際の行数は、Aで16k、Bで13kです。合計69行(ソートが適用されます)。このクエリは非常に高速に発生します。
TOP 1001
オプティマイザーを追加するとき、ハッシュ一致を使用しません。代わりに、最初にテーブルAからの結果をソートし(同じ推定値/実際の19k / 16k)、テーブルBに対してネストされたループを実行します。テーブルBの推定行数は1になり、奇妙なことはTOP n
、 Bに対する推定実行数(インデックスシーク)-常に2n + 1、または私の場合は2003であるように見えますTOP n
。もちろん、これはネストされた結合であるため、実際の実行回数は16k(テーブルAの行数)であり、これによりクエリの速度が低下します。
実際のシナリオはもう少し複雑ですが、これは基本的なアイデア/動作をキャプチャします。両方のテーブルは、インデックスシークを使用して検索されます。これはSQL Server 2008 R2 Enterpriseエディションです。
FAST num_rows
クエリヒント。
ORDER BY
句があります。追加TOP
( -私は知らない、もちろん2が関連している可能性があり)...このソートが発生した計画の変更を、私はより多くのそれは、インデックスの実行回数がテーブルBに対して求めてどのように影響するかが心配です