Użytkownicy programu SQL Server używają terminu „sargable” . Zastanawiam się, czy istnieje obiektywna, ponadczasowa, niezależna od implementacji definicja „sargable”.
Na przykład WHERE foo LIKE '%bar%'
wiele osób uważa , że nie można ich sprzedawać , ale niektóre RDBMS są w stanie używać indeksów do takich zapytań . Co zatem oznacza „niewymienny” ?
Inne referencje
terminology
Evan Carroll
źródło
źródło
Odpowiedzi:
Termin „sargable” został po raz pierwszy wprowadzony przez P. Griffithsa Selingera i in. w artykule z 1979 r. „Wybór ścieżki dostępu w systemie zarządzania relacyjnymi bazami danych”, opublikowanym przez ACM . Dla członków spoza ACM kopię tego dokumentu można znaleźć na stronie http://cs.stanford.edu/people/chrismre/cs345/rl/selinger.pdf
Termin jest zdefiniowany w tym akapicie:
Innymi słowy, orzeczenie podlegające wymianie jest takie, że może być rozwiązane przez silnik pamięci masowej (metoda dostępu) bezpośrednio obserwując tabelę lub rekord indeksu. I odwrotnie, orzeczenie niewymieralne wymaga wyższego poziomu DBMS, aby podjąć działanie. Na przykład o wyniku
WHERE lastname = 'Doe'
może decydować silnik pamięci masowej, po prostu patrząc na zawartość polalastname
każdego rekordu. Z drugiej stronyWHERE UPPER(lastname) = 'DOE'
wymaga wykonania funkcji przez silnik SQL, co oznacza, że silnik pamięci będzie musiał zwrócić wszystkie odczytywane wiersze (pod warunkiem, że pasują one do innych przewidywalnych predykatów) z powrotem do silnika SQL w celu oceny, co spowoduje dodatkowe koszty procesora .Z oryginalnej definicji można zobaczyć, że predykaty sargable mogą dotyczyć nie tylko skanów indeksu, ale także skanów tabel (segmentów w terminologii Systemu R), o ile spełnione są warunki „porównanie operatora z wartością kolumny” i dlatego mogą być oceniane przez silnik pamięci masowej. Tak jest w przypadku Db2, potomka Systemu R na wiele sposobów :
O tym, że w SQL Server-mówionych przewidywalnych predykatach są tylko te, które można rozwiązać za pomocą wyszukiwania indeksowego, prawdopodobnie wynika z niezdolności silnika pamięci masowej do zastosowania takich predykatów podczas skanowania tabeli.
Predykaty możliwe do zdobycia i niewymienne są czasami określane odpowiednio jako predykaty „etap 1” i „etap 2” (wynika to również z terminologii Db2 ). Predykaty etapu 1 można oceniać na najniższym poziomie przetwarzania zapytania podczas odczytywania rekordów tabeli lub indeksu. Rzędy, które spełniają warunki etapu 1, jeśli występują, są wysyłane na następny poziom oceny, etap 2.
1 - Segment w Systemie R to fizyczne przechowywanie krotek tabeli; skanowanie segmentów jest nieco równoważne skanowaniu tabeli w innych DBMS.
2 - Interfejs RSI - RSS 3 , zorientowany na krotki interfejs zapytań. Właściwą dla tej dyskusji funkcją interfejsu jest DALEJ, która zwraca predykaty zapytania pasującego do następnego wiersza.
3 - RSS lub Research Storage System, podsystem pamięci systemu R.
źródło
= UPPER()
wywołanie funkcji, alememcmp
samo w sobie. Byłoby stosunkowo łatwo napisać,memcmp
który zakłada ASCII i ignoruje wielkość liter (wystarczy spojrzeć na drugą końcówkę). Czy to czyni ZNAJOMEGO? Zobacz także przykład @ Ypercube, dba.stackexchange.com/questions/162263/…x=0
SARGable? A co-0 = +0
,' ' = ''
czy równość przestrzenny? Jaki byłby na przykład przykład SARGable? Kiedy mówisz „bez uciekania się do funkcji bazy danych zaimplementowanych poza silnikiem pamięci” , włączasz się do przykładu Ypercube,DATE()
który jest zawarty w silniku pamięci. Dlaczego sama SARGable nie jest możliwa?DATE()
nie jest to prawdziwa funkcja (SQL Server), ale (przypuszczam) skrót pana Cube do konwersji typu. Możemy również omówić to na czacie, jeśli chcesz.Dla mnie SARGable oznacza, że SQL Server może wykonywać wyszukiwanie indeksu przy użyciu predykatów wyszukiwania.
Nie można po prostu powiedzieć, że DBMS może „wykorzystać” indeks, ponieważ przy predykcie niewymieralnym SQL Server może skończyć skanowaniem indeksu nieklastrowanego.
źródło
Według danych wewnętrznych Pro SQL Server autorstwa Dmitrija Korotkevitcha :
Przykład :
Demo :
Teraz uruchamiamy:
Wyniki są następujące:
Spójrzmy na właściwości zapytania SARGable (Wyszukiwanie indeksu)
Optymalizator zapytań jest w stanie zdefiniować limit w indeksie początku i końca. Ma argument wyszukiwania do zapytania.
Teraz zapytanie inne niż SARGable:
Możesz zobaczyć, że na początku predykatu „% non ..%” nie pozwala optymalizatorowi zapytań na określenie początku i końca lub zakresu w indeksie. Musi teraz przeszukać całą tabelę (skan).
źródło
WHERE name like '%non-SARGable%'
czy to powoduje, że warunek jest podatny na sprzedaż? A jeśli tak, to czy nie mówimy o konkretnej wadzie implementacji? IE., Czy nie powinniśmy powiedzieć „nie można sargable od SQL Server 2016”WHERE DATE(datetime_column) = '2001-01-01'
na przykład jest „sargable” (będzie szukał indeksu) w nowszych wersjach SQL Server (chyba 2008+), ale nie w starszych.