Ho una query che deve essere dinamica su alcune colonne, ovvero ottengo un parametro e in base al suo valore decido quale colonna recuperare nella mia clausola Where . Ho implementato questa richiesta utilizzando l'espressione "caso":L'utilizzo di "CASE" nella clausola Where per scegliere varie colonne danneggia le prestazioni
(CASE @isArrivalTime WHEN 1 THEN ArrivalTime ELSE PickedupTime END)
>= DATEADD(mi, [email protected], @sTime)
AND (CASE @isArrivalTime WHEN 1 THEN ArrivalTime ELSE PickedupTime END)
< DATEADD(mi, [email protected], @fTime)
Se @isArrivalTime = 1
poi scelto ArrivalTime
colonna altro ha scelto PickedupTime
colonna. Ho un indice cluster su ArrivalTime
e indice non cluster su PickedupTime
.
Ho notato che quando utilizzo questa query (con @isArrivalTime = 1
), la mia prestazione è molto peggiore rispetto al solo utilizzo di ArrivalTime
.
Forse il Query Optimizer non può usare \ scegliere l'indice correttamente in questo modo?
Ho confrontato i piani di esecuzione e ho notato che quando sto usando il CASE
il 32% del tempo viene sprecato nella scansione dell'indice, ma quando non ho usato il CASE (just used
ArrivalTime`) solo il 3% è stato sprecato su questo indice di scansione.
Qualcuno sa il motivo di questo?
Yap, che ha risolto il mio problema. Grazie! –