Encontré una situación extraña en la que agregar OPTION (RECOMPILE)
mi consulta hace que se ejecute en medio segundo, mientras que la omisión hace que la consulta tarde más de cinco minutos.
Este es el caso cuando la consulta se ejecuta desde el Analizador de consultas o desde mi programa C # a través de SqlCommand.ExecuteReader()
. Llamar (o no llamar) DBCC FREEPROCCACHE
o DBCC dropcleanbuffers
no hace ninguna diferencia; Los resultados de la consulta siempre se devuelven instantáneamente con OPTION (RECOMPILE)
y más de cinco minutos sin ella. La consulta siempre se llama con los mismos parámetros [por el bien de esta prueba].
Estoy usando SQL Server 2008.
Me siento bastante cómodo escribiendo SQL, pero nunca antes he usado un OPTION
comando en una consulta y no estaba familiarizado con todo el concepto de cachés de planes hasta escanear las publicaciones en este foro. Mi comprensión de las publicaciones es que OPTION (RECOMPILE)
es una operación costosa. Aparentemente crea una nueva estrategia de búsqueda para la consulta. Entonces, ¿por qué es que las consultas posteriores que omiten OPTION (RECOMPILE)
son tan lentas? ¿No deberían las consultas posteriores hacer uso de la estrategia de búsqueda que se calculó en la llamada anterior que incluía la sugerencia de recompilación?
¿Es muy inusual tener una consulta que requiera una sugerencia de recompilación en cada llamada?
Perdón por la pregunta de nivel de entrada, pero realmente no puedo hacer cara o cruz de esto.
ACTUALIZACIÓN: me han pedido que publique la consulta ...
select acctNo,min(date) earliestDate
from(
select acctNo,tradeDate as date
from datafeed_trans
where feedid=@feedID and feedDate=@feedDate
union
select acctNo,feedDate as date
from datafeed_money
where feedid=@feedID and feedDate=@feedDate
union
select acctNo,feedDate as date
from datafeed_jnl
where feedid=@feedID and feedDate=@feedDate
)t1
group by t1.acctNo
OPTION(RECOMPILE)
Cuando ejecuto la prueba desde el Analizador de consultas, antepongo las siguientes líneas:
declare @feedID int
select @feedID=20
declare @feedDate datetime
select @feedDate='1/2/2009'
Al llamarlo desde mi programa C #, los parámetros se pasan a través de la SqlCommand.Parameters
propiedad.
Para los fines de esta discusión, puede suponer que los parámetros nunca cambian, por lo que podemos descartar el olor de parámetros subóptimos como la causa.
X = @X OR @X IS NULL
a X=@X
y realizar una buscan vemos aquí o empujar hacia abajo los predicados más contra una vista con las funciones de ventana
RECOMPILE
. En cualquier caso, capture los planes de ejecución y observe las diferencias.