OrderId
にインデックスを付ける必要があります。したがって、最初のインスタンスで:
ROW_NUMBER() OVER (ORDER BY OrderId DESC) AS RowNumber
SQLはもともとOrderId
列に索引スキャンを行ったソートを実行する必要はありません。索引は、注文する列によって順序付けされるので、別のソートを実行する必要はありません。
ただし、2番目の例では、SQLは各行に対してCASE @SortColumn WHEN 'OrderId' THEN ROW_NUMBER() OVER (ORDER BY OrderId DESC) END
を評価する必要があります。したがって、各行に対してCompute Scalar演算を実行してCASE
ステートメントの結果を計算します。この操作の結果は、列を表していないため、さらにソート操作が必要なため、索引にマップすることはできません。 500万行を超えると、これは非常に高価な操作です。
あなたは非インデックス列を介してクエリを実行した場合:
--takes 25 second
ROW_NUMBER() OVER (ORDER BY NonIndexedColumn DESC) AS RowNumber
--takes around 25 seconds
CASE @SortColumn WHEN 'NonIndexedColumn' THEN ROW_NUMBER() OVER (ORDER BY NonIndexedColumn DESC) AS RowNumber
SQLは、両方のインスタンスでソートする必要があり(とちょうどソートインデックスを使用していない)と同じように、両方のクエリが、おそらく同じようにゆっくり実行します。したがって、列を並べ替えるために渡すことは、インデックスされていない列を選択した場合、多数の行にわたってパフォーマンスが低下することになります。したがって、ORDER BY
が適用される前に、結果が管理可能な行に絞り込まれるようにする必要があります。
各状況でクエリプランを確認しましたか?違いは何ですか?あなたはその計画を投稿できますか? – strickt01
ありがとう@ strickt01。違いはソートコストだけです。 – ihsany