Mamy wiele "przeszukiwanych procedur przechowywanych", które pobierają wiele parametrów zerowalnych do wyszukiwania wierszy danych w różnych tabelach. Oni zwykle zbudowany tak:T-SQL - używany jest plan nieoptymalny - klauzula WHERE powinna zostać skrócona
SELECT *
FROM Table1 T1
INNER JOIN Table2 T2
ON T2.something = T1.something
WHERE (@parameter1 IS NULL OR T1.Column1 = @parameter1)
AND (@parameter2 IS NULL OR T2.Column2 = @parameter2)
AND (@parameter3 IS NULL OR T1.Column3 LIKE '%' + @parameter3 + '%')
AND (@parameter4 IS NULL OR T2.Column4 LIKE '%' + @parameter4 + '%')
AND (@parameter5 IS NULL OR T1.Column5 = @parameter5)
ten może trwać nawet do 30-40 parametrów i co zauważyliśmy to choćby parameter1 jest plan wykonanie przechodzi skanów indeks inne tabele, które mogą znacznie spowolnić zapytanie (kilka sekund). Testy pokazują, że zachowanie tylko pierwszego wiersza z instrukcji WHERE powoduje natychmiastowe zapytanie.
Czytałem, że shortcuiting nie jest możliwe, ale istnieją sposoby obejścia lub do konstruowania zapytań, które może być bardziej efektywne?
Obecnie pracujemy nad tym problemem, mając różne wersje tego samego SELECT/FROM/JOINS, ale z innym zestawem parametrów w klauzuli WHERE i w zależności od tego, które parametry są przekazywane, wybieramy odpowiednią instrukcję wyboru, którą chcemy przejść. Jest to długi, brudny i trudny do utrzymania.
Czy rozważałeś użycie [dynamicznego SQL] (http://www.sommarskog.se/dynamic_sql.html)? Nawet z zastrzeżeniem [SQL Injection] (http://en.wikipedia.org/wiki/SQL_injection) może być bardziej odpowiedni do twoich potrzeb. – Oded
Budowanie sparametryzowanego dynamicznego sql i sql injection nie jest problemem – StrayCatDBA
Spójrzmy ponownie na dynamiczny sql, ale wydaje się, że po prostu wracamy do tego, jak zwykliśmy robić rzeczy i budować złożone łańcuchy kodu SQL w samych aplikacjach z kilka warunków, które sprawiły, że niemal niemożliwe było szybkie zrozumienie zapytania. Czy istnieje również sposób na utrzymanie podświetlania składni/narzędzi w studiu zarządzania SQL dla tych zapytań? – FrancoisCN