Z definicji (przynajmniej z tego, co widziałem) sargable oznacza, że zapytanie może zoptymalizować mechanizm wykonywania zapytań przez silnik zapytań. Próbowałem poszukać odpowiedzi, ale wydaje się, że nie ma wiele na ten temat. Pytanie brzmi: co sprawia, że zapytanie SQL może zostać przeszukiwane? Każda dokumentacja byłaby bardzo mile widziana.
Dla porównania: SARGable
sql-server
performance
DForck42
źródło
źródło
Odpowiedzi:
Najczęstszą rzeczą, która powoduje, że zapytanie nie jest możliwe do wysłania, jest umieszczenie pola wewnątrz funkcji w klauzuli where:
Optymalizator SQL nie może używać indeksu na myDate, nawet jeśli taki istnieje. Będzie musiał dosłownie ocenić tę funkcję dla każdego wiersza tabeli. Znacznie lepiej użyć:
Kilka innych przykładów:
źródło
GROUP BY
spowoduje, że zapytanie stanie się niewymienne?WHERE ((FullName = 'Ed Jones') OR (FullName IS NULL))
byłaby to jeszcze lepsza wersjaSELECT... FROM ... WHERE FullName = 'Ed Jones' UNION SELECT...FROM...WHERE FullName IS NULL
? Pewnego razu specjalista od optymalizacji powiedział mi, że użycie OR w klauzuli where może rozładować zapytania ..?Select ... WHERE isNull(FullName,'Ed Jones') = 'Ed Jones'
aSelect ... WHERE ((FullName = 'Ed Jones') OR (FullName IS NULL))
. Oboje używają indeksu na FullName i szukają indeksu.Nie rób tego:
Powoduje to skanowanie tabeli / indeksu, ponieważ wartość LIKE zaczyna się od znaku wieloznacznego.
Nie rób tego:
To powoduje skanowanie tabeli / indeksu.
Serwer bazy danych będzie musiał ocenić FUNCTION () dla każdego wiersza w tabeli, a następnie porównać go z „BLAH”.
Jeśli to możliwe, zrób to w odwrotnej kolejności:
Spowoduje to uruchomienie INVERSE_FUNCTION () dla parametru jeden raz i nadal pozwoli na użycie indeksu.
źródło
W tej odpowiedzi zakładam, że baza danych ma wystarczającą liczbę indeksów. Jest wystarczająco dużo pytań na ten temat .
Często zdatność zapytania do zapytania zależy od punktu krytycznego powiązanych indeksów. Punkt krytyczny określa różnicę między wyszukiwaniem a skanowaniem indeksu podczas łączenia jednej tabeli lub zestawu wyników do drugiej. Jedno wyszukiwanie jest oczywiście znacznie szybsze niż skanowanie całej tabeli, ale gdy trzeba szukać wielu wierszy, skanowanie może mieć większy sens.
Zatem między innymi instrukcja SQL jest bardziej zrozumiała, gdy optymalizator spodziewa się, że liczba wynikowych wierszy jednej tabeli będzie mniejsza niż punkt końcowy możliwego indeksu w następnej tabeli.
Szczegółowy post i przykład można znaleźć tutaj .
źródło
Aby operacja została uznana za możliwą do sargowania, nie wystarczy, aby mogła po prostu użyć istniejącego indeksu. W powyższym przykładzie dodanie wywołania funkcji względem kolumny indeksowanej w klauzuli where najprawdopodobniej nadal skorzystałoby z określonego indeksu. Będzie „skanować”, czyli pobiera wszystkie wartości z tej kolumny (indeksu), a następnie eliminuje te, które nie pasują do podanej wartości filtru. Nadal nie jest wystarczająco wydajny w przypadku tabel z dużą liczbą wierszy. To, co tak naprawdę definiuje sargility, to zdolność zapytania do przeszukania indeksu b-drzewa za pomocą binarnej metody wyszukiwania, która polega na eliminacji w połowie zestawu tablicy posortowanych elementów. W SQL byłby wyświetlany w planie wykonania jako „wyszukiwanie indeksu”.
źródło