W naszej bazy danych SQL Server 2005 (testowane przy użyciu Management Studio z DBCC FREEPROCCACHE
i DBCC DROPCLEANBUFFERS
), następujące stwierdzenie jest szybko (~ 0.2s czasie kompilacji, ~ czas 0.1s wykonanie):Prevent ADO.NET z użyciem sp_executesql
SELECT ... FROM ... WHERE a = 1 AND b = '' ...
następujące oświadczenie jest jednak powolny (~ 0.2s czasie kompilacji, 7-11s czas realizacji):
exec sp_executesql N'SELECT ... FROM ... WHERE a = @a AND b = @b ...', N'@a int, @b nvarchar(4000), ...', @a=1, @b=N'', ...
SQL Server wybiera inny plan wykonania, chociaż zapytania są równe. Ma to sens, ponieważ w pierwszym przypadku SQL Server ma rzeczywiste wartości a
, b
i wszystkie pozostałe dostępne parametry i może użyć statystyk do stworzenia lepszego planu. Wygląda na to, że plan zapytania dla konkretnych wartości parametrów jest o wiele lepszy od o wiele lepszy od i zdecydowanie przewyższa wszelkie korzyści związane z wydajnością "buforowania planu zapytań".
Teraz moje pytanie: ADO.NET zawsze wydaje się wykorzystywać drugą opcję (sp_executesql) podczas wykonywania kwerend parametrycznych, które zwykle sens (plan zapytania buforowanie, etc.). W naszym przypadku jednak to zabija wydajność. Tak, czy istnieje jakiś sposób, aby zarówno
- siły ADO.NET użyć czegoś innego niż
sp_executesql
(czyli coś, gdzie analizator zapytań SQL Server wykonuje rzeczywiste wartości parametrów pod uwagę) lub - siły SQL Server dokonać ponownej krystalizacji planu zapytania SQL przekazanego do
sp_executesql
biorąc pod uwagę wartości parametrów?
I proszę nie mów mi, że musiał wrócić do brzydkich, starych, niebezpiecznych sql = "WHERE b = " + quoteAndEscape(parameterB)
...
Uruchamianie SQL w procedurze przechowywanej ma znaczenia (powolny, zi bez WITH RECOMPILE
) . Nie opublikowałem aktualnej instrukcji SQL, ponieważ jest ona dość złożona (dołącza się do wielu tabel, w tym podelektronów i agregacji).
Konwersja do procedury przechowywanej jest tak powolna jak zapytanie adhoc? To jest BARDZO dziwne zachowanie, więc muszę zapytać: czy jesteś pewien? –
@Rubens - dlaczego tak mówisz? Jaką przewagę wydajności ma procedura składowana oferowana w buforowanej, skompilowanej, sparametryzowanej kwerendzie adhoc? –
Tak, jestem pewien. Dlaczego powinien być szybszy? Czas kompilacji jest nieznacznie mały (0,2 s) w porównaniu do czasu wykonania (7-11s). – Heinzi