Diferencia de rendimiento entre paso con variables y sql dinámico

05/10/2005 - 12:31 por Tako | Informe spam
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

#1 Maxi
05/10/2005 - 13:40 | Informe spam
Hola, podrias pasarnos los planes de ejecucion? todo esto lo estas
ejecutando desde el QA?


Salu2
Maxi


"Tako" escribió en el mensaje
news:

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

Preguntas similares