在Where子句中使用"CASE"来选择各种列损害性能

6 sql database sql-server sql-server-2005 database-performance

我有一些查询需要在某些列上是动态的,这意味着我得到一个参数,根据它的值,我决定在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)
Run Code Online (Sandbox Code Playgroud)

如果@isArrivalTime = 1然后选择ArrivalTime列,则选择PickedupTime列.我有一个聚簇索引ArrivalTime和非聚集索引PickedupTime.

我注意到,当我使用这个查询(with @isArrivalTime = 1)时,与仅使用相比,我的表现要差很多ArrivalTime.

也许查询优化器不能使用\以这种方式正确选择索引?

我比较了执行计划时注意到当我使用CASE32%的时间浪费在索引扫描上时,但是当我没有使用CASE (just usedArrivalTime`时,只有3%被浪费在这个索引扫描上.

有谁知道这个的原因?

Xor*_*dal 0

尝试设置日期时间边界:

declare @resSTime datetime
        ,@resFTime datetime

set @resSTime = DATEADD(mi, -@TZOffsetInMins, @sTime)
set @resFTime = DATEADD(mi, -@TZOffsetInMins, @fTime)
Run Code Online (Sandbox Code Playgroud)

并尝试将大小写更改为“or”

( ArrivalTime >= @resSTime 
    and ArrivalTime < @resFTime 
    and @isArrivalTime = 1 )
or ( PickedupTime >= @resSTime 
    and PickedupTime < @resFTime 
    and @isArrivalTime <> 1 )
Run Code Online (Sandbox Code Playgroud)