Zastanawiam się, czy istnieje jakiś rozsądny sposób przepisania następującego zapytania, aby indeksy kolumn były używane przez optymalizator?Jak zoptymalizować użycie klauzuli "LUB" podczas używania z parametrami (SQL Server 2008)
Create Procedure select_Proc1
@Key1 int=0,
@Key2 int=0
As
BEGIN
Select key3
From Or_Table
Where (@key1 =0 OR Key1 [email protected]) AND
(@key2 =0 OR Key2 [email protected])
END
GO
Chociaż kolumny klauzul Gdzie są objęte indeksów, SQL Server nie jest w stanie korzystać z tych indeksów. Rodzi to pytanie, czy cokolwiek "blokuje" korzystanie z indeksów. Odpowiedź na to pytanie brzmi "tak" - sprawcami są parametry i warunek "OR". Parametry nie są uwzględnione w indeksach, co oznacza, że SQL Server nie może użyć żadnego z indeksów do oceny "@ klucz1 = 0" (warunek, który dotyczy także klucza @ 2 = 0). Oznacza to, że SQL Server nie może używać indeksów do oceny klauzuli "@ klucz1 = 0 OR klucz1 = klucz @ 1" (ponieważ klauzula "OR" to połączenie wierszy objętych dwoma warunkami). Ta sama zasada odnosi się również do drugiej klauzuli (re. Key2). To prowadzi SQL Server do wniosku, że żadne indeksy nie mogą być użyte do wyodrębnienia wierszy, pozostawiając SQL Server do wykorzystania następnego najlepszego podejścia - klastrowany skan indeksu
Jak widać, optymalizator SQL nie użyje indeksów w kolumnach jeśli predykaty są "LUB" w klauzuli WHERE. Jednym z rozwiązań tego problemu jest oddzielenie zapytań klauzulą FI dla wszystkich możliwych kombinacji parametrów.
Proszę przeczytać ten krótki artykuł, aby uzyskać lepszy widok problemu: http://www.sql-server-performance.com/articles/per/optimize_or_clause_p1.aspx
Teraz moje pytanie, co powinniśmy zrobić, jeśli możliwe kombinacje są bardziej, że tylko trzy lub cztery? Pisanie oddzielnego zapytania dla każdej kombinacji nie wydaje się racjonalnym rozwiązaniem. Czy istnieje inne obejście tego problemu?
Ciekawe podejście, będę musiał o tym pamiętać. Przypuszczam, że miałoby to również zastosowanie do innych RDBMS, takich jak Oracle, gdzie 'OR' jest strasznie nieefektywne. – Lucero
Czy to jedyny sposób? Co się stanie, jeśli zapytanie będzie bardziej skomplikowane (dotyczy to więcej klauzul OR)? – Meysam