我的查询需要在某些列上是动态的,这意味着我得到一个参数并根据它的值决定在 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 (just used
ArrivalTime`) 时,只有 3% 的时间被浪费在了索引扫描上。
有谁知道这是什么原因?