Tengo una consulta que debe ser dinámica en algunas de las columnas, lo que significa que obtengo un parámetro y de acuerdo con su valor decido qué columna buscar en mi cláusula Where . He aplicado esta solicitud usando la expresión "CASE":Usar "CASE" en la cláusula WHERE para elegir varias columnas daña el rendimiento
(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)
Si @isArrivalTime = 1
después eligió ArrivalTime
columna demás eligió PickedupTime
columna. Tengo un índice agrupado en ArrivalTime
y un índice no agrupado en PickedupTime
.
Me he dado cuenta de que cuando estoy usando esta consulta (con @isArrivalTime = 1
), mi rendimiento es mucho peor en comparación con solo el uso de ArrivalTime
.
Tal vez el optimizador de consultas no puede usar \ elegir el índice correctamente de esta manera?
He comparado los planes de ejecución y he notado que cuando uso el CASE
el 32% del tiempo se desperdicia en el escaneo de índice, pero cuando no uso el CASE (just used
ArrivalTime`) solo el 3% se desperdicia en este escaneo de índice.
¿Alguien sabe la razón de esto?
Yap, que resolvió mi problema. ¡Gracias! –