In un database di SQL Server 2005 Sto lavorando a questa query:Perchè una query con parametri produce notevolmente più lento piano di query vs di query senza parametri
select *
da foo
unirsi bar in bar .x = foo.x
unirsi Baz su baz.y = foo.y
dove foo.x = 1000
ha un piano di query molto diverso e più veloce rispetto alla versione seguente parametrizzato.
dichiarare @ p0 int
set @ p0 = 1000
select *
da foo
unirsi bar bar.x = foo.x
unirsi Baz su baz.y = foo.y
dove foo.x = @ p0
Nel mio caso particolare, la versione con letterale viene eseguita in un secondo tempo inferiore. La versione parametrizzata richiede 2-3 secondi. Mi aspettavo che fossero identici dato che sono la stessa domanda.
Perché ricevono piani di query diversi?
Esiste un modo per rendere la versione parametrizzata con le stesse prestazioni della versione letterale?
Ecco i piani di query. La mia vera query è piuttosto diversa da quella generica che ho fornito sopra, tuttavia l'UNICA differenza tra le due query che hanno prodotto questi piani è il parametro. Perché sostituire un letterale con un parametro risulta in piani così diversi?
Hai controllato quali sono effettivamente i piani di esecuzione? (Utilizzando 'include il piano di esecuzione effettivo' in Management Studio) – Blorgbeard
Sì, e sono completamente diversi. –
Vuoi includere i piani di esecuzione? Possono indicare qual è il problema. –