BETWEEN
powinien przewyższa IN
w tym przypadku (ale tak mierzyć i sprawdzać również plany wykonania!), zwłaszcza jako n
rośnie, a statystyki są nadal dokładne. Załóżmy:
m
to rozmiar twojego stołun
to rozmiar twojego asortymentu
Indeks może być użyty (n
jest mały w porównaniu do m
)
-
Teoretycznie
BETWEEN
można zaimplementować za pomocą pojedynczego „skanowania zakresu” (mówienie Oracle) na indeksie klucza podstawowego, a następnie przejść co najwyżejn
węzły liści indeksu. Złożoność będzie wynosićO(n + log m)
-
IN
jest zwykle implementowany jako seria (pętla)n
„skanowanie zakresu” w indeksie klucza podstawowego. Zm
będąc rozmiarem tabeli, złożoność zawsze będzie wynosićO(n * log m)
... co zawsze jest gorsze (nieistotne dla bardzo małych tabelm
lub bardzo małe zakresyn
)
Nie można użyć indeksu (n
to znaczna część m
)
W każdym razie uzyskasz pełne skanowanie tabeli i ocenisz predykat w każdym wierszu:
-
BETWEEN
musi ocenić dwa predykaty:jeden dla dolnej granicy, a drugi dla górnej granicy. Złożoność toO(m)
-
IN
musi ocenić co najwyżejn
predykaty. Złożoność toO(m * n)
... co znowu jest zawsze gorsze, a możeO(m)
czy baza danych może zoptymalizowaćIN
lista ma być hashmapą, a nie listą predykatów.