Eu encontrei uma situação estranha em que o acréscimo OPTION (RECOMPILE)
à minha consulta faz com que ela seja executada em meio segundo, enquanto a omissão faz com que a consulta demore mais de cinco minutos.
Este é o caso quando a consulta é executada no Query Analyzer ou no meu programa C # via SqlCommand.ExecuteReader()
. Ligar (ou não ligar) DBCC FREEPROCCACHE
ou DBCC dropcleanbuffers
não faz diferença; Os resultados da consulta sempre são retornados instantaneamente com OPTION (RECOMPILE)
mais de cinco minutos sem ela. A consulta é sempre chamada com os mesmos parâmetros [para fins deste teste].
Estou usando o SQL Server 2008.
Estou bastante confortável em escrever SQL, mas nunca usei um OPTION
comando em uma consulta antes e não estava familiarizado com todo o conceito de caches de plano até verificar as postagens neste fórum. Meu entendimento das postagens é que OPTION (RECOMPILE)
é uma operação cara. Aparentemente, cria uma nova estratégia de pesquisa para a consulta. Então, por que as consultas subsequentes que omitem o OPTION (RECOMPILE)
são tão lentas? As consultas subsequentes não deveriam usar a estratégia de pesquisa que foi computada na chamada anterior, que incluía a dica de recompilação?
É altamente incomum ter uma consulta que exija uma dica de recompilação em cada chamada?
Desculpem a pergunta de nível de entrada, mas não consigo realmente entender isso.
UPDATE: me pediram para postar a 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)
Ao executar o teste no Query Analyzer, acrescento as seguintes linhas:
declare @feedID int
select @feedID=20
declare @feedDate datetime
select @feedDate='1/2/2009'
Ao chamá-lo do meu programa C #, os parâmetros são passados através da SqlCommand.Parameters
propriedade
Para os fins desta discussão, você pode assumir que os parâmetros nunca mudam, para que possamos descartar o cheiro sub-ideal dos parâmetros como a causa.
X = @X OR @X IS NULL
de X=@X
e realizando uma busca Veja aqui ou empurrar predicados ainda mais para baixo contra uma exibição com funções da janela
RECOMPILE
. De qualquer forma, capture os planos de execução e observe as diferenças.