2010-10-19 2 views
6

Esempio di query:Perché la versione parametrizzata di questa query è più lenta di una versione non parametrizzata?

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 

Sono una query che è simile a quello sopra e quando uso questo stored procedure viene eseguito a tempo indeterminato senza dare alcun output. Ma se io uso la stessa query,

Questo esegue in meno di un secondo.

mio table2 ha 140K record e TABLE1 alcuni 250K

Qualche idea di cosa potrebbe essere la causa come operatore per l'esecuzione lenta?

+0

Hai esaminato un piano di spiegazioni per la query? –

+0

Sulla base dei vostri test, non sembra affatto che abbia qualcosa a che fare con la parola chiave simile, poiché anche la versione veloce include quell'operatore. – JohnFx

+0

ho provato a eseguire entrambi e viene eseguito meno di un secondo quando utilizzo direttamente i parametri. –

risposta

4

Non sa al momento della compilazione che @param non avrà un carattere jolly iniziale, quindi quando compila il batch, fornisce un piano con una scansione e non una ricerca.

Si potrebbe forse provare OPTION (RECOMPILE) o OPTION (FORCESEEK) (SQL Server 2008) per vedere se offre un piano migliore.

+0

+1 e grazie per avermi impostato direttamente sulla variabile locale. –

+0

OPZIONE (RECOMPILE) funzionante. Ora funziona meno di un secondo. La mia query originale ha 4 inner join e 3 left outer joins. –

+0

@rs - Dopo aver fatto alcuni test, sto iniziando a dubitare della mia spiegazione. Quando guardo il piano di procedura memorizzato vedo che entrambi finiscono con una ricerca per indice. La versione parametrizzata ha un operatore scalare di calcolo che chiama 'LikeRangeStart' e' LikeRangeEnd'. In realtà utilizza questo intervallo di ricerca anche quando è presente un carattere jolly principale. Come sono i tuoi piani di esecuzione? Mi chiedo se la collazione possa fare la differenza (o forse è solo una questione di statistiche distorte che significa che modifica l'ordine degli operatori) –