Sperimentato lo stesso comportamento. (imposta le opzioni uguali) Query normale che produce piano parallelo e usando sp_executesql ha prodotto un piano seriale.
declare @xyzParam1 datetime,@xyzParam2 datetime
select @xyzParam1='Sep 1 2014 12:00:00:000AM',@xyzParam2='Sep 26 2014 11:59:59:000PM'
SELECT * FROM Theview WHERE departuretime BETWEEN @xyzParam1 AND @xyzParam2
;
vs
exec sp_executesql N'SELECT * FROM Theview WHERE departuretime BETWEEN @xyzParam1 AND @xyzParam2',N'@xyzParam1 datetime,@xyzParam2 datetime',@xyzParam1='Sep 1 2014 12:00:00:000AM',@xyzParam2='Sep 26 2014 11:59:59:000PM'
sono riuscito ad ottenere un risultato ottimale modificando la vista utilizzata perché conteneva esempio left join per i dati che erano sempre previsti. (Convertito in inner join)
Ora la query regolare raccoglie lo stesso piano di quella ottenuta utilizzando sp_executesql e le prestazioni è il modo migliore.
Mi chiedo quando il "muto sp_executesql non memorizza i piani" il mito morirà mai - leggi [La maledizione e le benedizioni di SQL dinamico] (http://www.sommarskog.se/dynamic_sql.html) –
Ponticelli @OMG - il parametro sniffing potrebbe essere un problema con sp_ExecuteSQL? – JNK
@JNK: Da quando ho riscontrato il comportamento, ho comunque inserito lo snodo anti-param in base all'impostazione predefinita. –