一部の列で動的にする必要があるクエリがあります。つまり、パラメーターを取得し、その値に応じて Where 句でフェッチする列を決定します。「CASE」式を使用してこのリクエストを実装しました。
(CASE @isArrivalTime WHEN 1 THEN ArrivalTime ELSE PickedupTime END)
>= DATEADD(mi, -@TZOffsetInMins, @sTime)
AND (CASE @isArrivalTime WHEN 1 THEN ArrivalTime ELSE PickedupTime END)
< DATEADD(mi, -@TZOffsetInMins, @fTime)
@isArrivalTime = 1
次にArrivalTime
列を選択した場合は、列を選択しPickedupTime
ました。にクラスター化インデックスArrivalTime
と に非クラスター化インデックスがありますPickedupTime
。
@isArrivalTime = 1
このクエリを ( とともに) 使用している場合、 のみを使用する場合に比べてパフォーマンスが大幅に低下することに気付きましたArrivalTime
。
クエリ オプティマイザが、この方法で適切にインデックスを使用\選択できないのではないでしょうか?
実行計画を比較したところCASE
、インデックス スキャンで 32% の時間が無駄になっていることに気付きましたが、CASE ArrivalTime`) を使用しなかった場合、(just used
このインデックス スキャンで無駄になったのは 3% だけでした。
この理由を知っている人はいますか?