Ho riscontrato una situazione strana in cui l'aggiunta OPTION (RECOMPILE)
alla mia query provoca l'esecuzione in mezzo secondo, mentre la sua omissione fa sì che la query impieghi più di cinque minuti.
Questo è il caso in cui la query viene eseguita da Query Analyzer o dal mio programma C # tramite SqlCommand.ExecuteReader()
. Chiamare (o non chiamare) DBCC FREEPROCCACHE
o DBCC dropcleanbuffers
non fa differenza; I risultati delle query vengono sempre restituiti istantaneamente con OPTION (RECOMPILE)
e per più di cinque minuti senza di essa. La query viene sempre chiamata con gli stessi parametri [per il bene di questo test].
Sto usando SQL Server 2008.
Sono abbastanza a mio agio con la scrittura di SQL ma non ho mai usato un OPTION
comando in una query prima e non avevo familiarità con l'intero concetto di cache del piano fino alla scansione dei post su questo forum. La mia comprensione dai post è che OPTION (RECOMPILE)
è un'operazione costosa. Apparentemente crea una nuova strategia di ricerca per la query. Allora perché è che le query successive che omettono OPTION (RECOMPILE)
sono così lente? Le query successive non dovrebbero utilizzare la strategia di ricerca calcolata nella chiamata precedente che includeva il suggerimento per la ricompilazione?
È molto insolito avere una query che richiede un suggerimento di ricompilazione per ogni singola chiamata?
Ci scusiamo per la domanda entry-level ma non riesco davvero a capirlo.
AGGIORNAMENTO: mi è stato chiesto di pubblicare la query ...
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)
Quando eseguo il test da Query Analyzer, preposto le seguenti righe:
declare @feedID int
select @feedID=20
declare @feedDate datetime
select @feedDate='1/2/2009'
Quando lo chiamo dal mio programma C #, i parametri vengono passati tramite la SqlCommand.Parameters
proprietà.
Ai fini di questa discussione, puoi presumere che i parametri non cambino mai, quindi possiamo escludere l'odore dei parametri non ottimali come causa.
X = @X OR @X IS NULL
per X=@X
e l'esecuzione di un cercano Vedere qui o spingendo predicati ulteriormente verso il basso su una vista con le funzioni delle finestre
RECOMPILE
. In ogni caso, catturare i piani di esecuzione e osservare le differenze.