Una pregunta sobre una consulta que me está volviendo tarumba: tengo una
consulta que hace cosas muy raras, después de muchas pruebas me di cuenta de
que si ejecutaba esta consulta en el Query Analizer todo iba de perlas:
SELECT TOP 1 a, b
FROM Test
WHERE ((a < 'f0898153-0ad8-4752-a7ac-0000fb8208e2') OR
(a = 'f0898153-0ad8-4752-a7ac-0000fb8208e2' AND b < 151872))
ORDER BY a DESC, b DESC
sin embargo si ejecuto tal y como se ejecuta en realidad, con parámetros el
rendimiento pasa de ser instantáneo a tardar algo más de 30 segundos
declare @a uniqueidentifier
declare @b numeric(18,0)
set @a = 'f0898153-0ad8-4752-a7ac-0000fb8208e2'
set @b = 151872
SELECT TOP 1 a, b
FROM Test
WHERE ((a < @a) OR (a = @a AND b < @b))
ORDER BY a DESC, b DESC
Viendo los planes de ejecución se ve que en el primer caso hace una búsqueda
en el índice y en segundo un scan.
Una forma de arreglarlo ha sido dividir la consulta de esta forma:
SELECT TOP 1 *
FROM
(
SELECT a, b
FROM Test
WHERE a < @a
union
SELECT a, bFROM Test
WHERE a = @n AND b < @d
) lala ORDER BY a DESC, b DESC
Como la condición es un OR se divide así sin mayor problema, sin embargo no
me parece normal tener que hacer este apaño.
¿Alguien tiene alguna sugerencia de lo que puede estar pasando?
Muchas gracias
Leer las respuestas