У меня есть запрос, который должен быть динамическим для некоторых столбцов, то есть я получаю параметр, и в соответствии с его значением я решаю, какой столбец выбрать в моем предложении 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% было потрачено впустую на это сканирование индекса.
Кто-нибудь знает причину этого?