2010-10-19 23 views
6
de consulta

muestra:¿Por qué la versión parametrizada de esta consulta se ejecuta más despacio que una versión no parametrizada?

CREATE PROCEDURE dbo.Test (@p varchar(10)) 
AS 
DECLARE @param varchar(10) 
SET @param = @p + '%' 

SELECT * FROM table1 t1 
INNER JOIN table2 t2 on t1.id = tr.id 
WHERE t2.desc LIKE @param 

Tengo una consulta que es similar a uno por encima y cuando se utiliza en este procedimiento almacenado que se ejecuta indefinidamente sin dar ninguna salida. Pero si uso la misma consulta como,

SELECT * FROM table1 t1 
INNER JOIN table2 t2 on t1.id = tr.id 
WHERE t2.desc LIKE 'A%' -- notice no parameter here 

Esto se ejecuta en menos de un segundo.

Mi tabla2 tiene 140K registros y tabla1 algunos 250K

Cualquier idea de lo que podría ser la causa como operador para correr lento?

+0

¿Has mirado un plan de explicación para la consulta? –

+0

Según sus pruebas, no parece tener nada que ver con la palabra clave similar, ya que incluso la versión rápida incluye ese operador. – JohnFx

+0

intenté ejecutar ambos y se ejecuta menos de un segundo cuando utilizo los parámetros directamente. –

Respuesta

4

No sabe en tiempo de compilación que @param no tendrá un comodín principal, por lo que cuando compila el lote le da un plan con un escaneo no una búsqueda.

Puede intentar OPTION (RECOMPILE) o OPTION (FORCESEEK) (SQL Server 2008) para ver si le ofrece un mejor plan.

+0

+1 y gracias por ponerme directamente sobre la variable local. –

+0

OPCIÓN (RECOMPRA) trabajado. Ahora funciona menos de un segundo. Mi consulta original tiene 4 combinaciones internas y 3 combinaciones externas izquierdas. –

+0

@rs - Después de hacer algunas pruebas, estoy empezando a dudar de mi explicación. Cuando miro el plan de procedimiento almacenado, veo que ambos terminan con una búsqueda de rango de índice. La versión parametrizada tiene un operador escalar de cómputo que llama a 'LikeRangeStart' y' LikeRangeEnd'. En realidad, utiliza esta búsqueda de rango incluso cuando hay un comodín principal. ¿Cómo son tus planes de ejecución? Preguntándose si la intercalación puede marcar la diferencia (o tal vez solo sea una cuestión de estadísticas sesgadas, lo que significa que altera el orden de los operadores) –

Cuestiones relacionadas