BETWEEN
měl by překonat IN
v tomto případě (ale dělejte měřit a kontrolovat také prováděcí plány!), zejména jako n
roste a statistiky jsou stále přesné. Předpokládejme:
m
je velikost vašeho stolun
je velikost vašeho rozsahu
Lze použít index (n
je malý ve srovnání s m
)
-
Teoreticky
BETWEEN
lze implementovat jediným „skenováním rozsahu“ (mluví Oracle) na indexu primárního klíče a poté procházet maximálněn
uzly indexového listu. Složitost budeO(n + log m)
-
IN
je obvykle implementován jako série (smyčka)n
"prohledávání rozsahu" na indexu primárního klíče. Pomocím
vzhledem k velikosti tabulky bude složitost vždyO(n * log m)
... což je vždy horší (zanedbatelné pro velmi malé tabulkym
nebo velmi malé rozsahyn
)
Nelze použít index (n
je významnou částí m
)
V každém případě získáte úplný sken tabulky a vyhodnotíte predikát na každém řádku:
-
BETWEEN
potřebuje vyhodnotit dva predikáty:jeden pro spodní a jeden pro horní hranici. Složitost jeO(m)
-
IN
potřebuje vyhodnotit maximálněn
predikáty. Složitost jeO(m * n)
... což je opět vždy horší, nebo možnáO(m)
pokud databáze dokáže optimalizovatIN
seznam bude hashmap, spíše než seznam predikátů.