Doświadczony takie samo zachowanie. (ustawiono opcje równe) Zwykły proces tworzenia równoległego planu i użycia sp_executesql wygenerował szeregowy plan.
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'
udało się uzyskać optymalny rezultat modyfikacji zużyty widok ponieważ zawiera np pozostawione sprzężenia dla danych, które zawsze były oczekiwane. (konwertowane na sprzężenie INNER)
Teraz zwykłe zapytanie wybiera ten sam plan, który uzyskano przy użyciu sp_executesql, a wydajność jest znacznie lepsza.
Zastanawiam się, kiedy „sp_executesql nie cache plany” mit nigdy nie umiera - czytaj [przekleństwa i błogosławieństwa dynamicznego SQL] (http://www.sommarskog.se/dynamic_sql.html) –
@OMG Kucyki - czy sniffowanie parametrów może być problemem z sp_ExecuteSQL? – JNK
@JNK: Odkąd przeżyłem to zachowanie, domyślnie włączyłem anty-paramiczne węszenie. –