2009-04-17 13 views
7

Así que aquí hay un poco extraño ... Tengo un proceso almacenado que tarda 40 segundos en ejecutarse. Copio el contenido del proceso almacenado a una nueva ventana de consulta, cambio los 2 parámetros de entrada (que son ambas fechas) para que se declaren y establezcan, y ejecute la consulta. Es básicamente ejecución instantánea, sub 1 segundo. La única diferencia es que el proceso almacenado toma las 2 fechas como parámetros.SQL Server Stored Proc tarda (mucho) más tiempo en ejecutarse que la misma consulta ejecutada desde texto en Management Studio

¿Alguien tiene alguna idea de lo que puede hacer que eso suceda?

(estoy corriendo SQL Server 2005)

+0

por cierto, he intentado marcar el proc de recompilación, que no tuvo efecto –

+0

http://www.sommarskog.se /query-plan-mysteries.html – Greg

Respuesta

13

Recopilación olfatea los parámetros, por lo que se puede hacer ninguna diferencia.

This article explains my statement ...

... valores de los parámetros se olieron durante compilación o recompilación ...

Usted necesita enmascarar los parámetros:

ALTER PROCEDURE [uspFoo] 
    @Date1 datetime, 
    @Date2 datetime 
AS 
BEGIN 
    DECLARE @IDate1 datetime, @IDate2 datetime; 
    SELECT @IDate1 = @Date1, @IDate2 = @Date2; 
    -- Stuff here that depends on @IDate1 and @IDate2 
END 
+0

me acabo de resolver esto, pero tienes razón :) –

+1

+1 Sé que esta es una publicación anterior pero me has salvado tratando de solucionar este problema. – twoleggedhorse

1

Run el generador de perfiles y captura los planes de consulta para la ejecución. Compruebe para ver cuáles son las diferencias: es posible que pueda ajustar la consulta o forzar un plan en particular.

1

Tuve un problema similar y encontré que fue causado porque estaba configurando el parámetro como FECHA pero la columna con la que se estaba comparando en la cláusula WHERE estaba en DATETIME, así que SSMS estaba convirtiendo el tipo de datos para cada fila que estaba comparando. Cambiar el tipo de datos de parámetro a DATETIME o enmascarar el parámetro como se mencionó anteriormente resuelve el problema.

4

Como dice gbn, este es un problema de detección de parámetros. Una forma alternativa para su sugerencia es incluir la siguiente línea al final de su consulta:

OPTION (RECOMPILE) 
Cuestiones relacionadas