BETWEEN
skal bedre end IN
i dette tilfælde (men gør mål og kontroller også udførelsesplaner!), især som n
vokser, og da statistikker stadig er nøjagtige. Lad os antage:
m
er størrelsen på dit bordn
er størrelsen på dit område
Indeks kan bruges (n
er lille sammenlignet med m
)
-
I teorien
BETWEEN
kan implementeres med en enkelt "range scan" (Oracle speak) på det primære nøgleindeks, og derefter krydse højstn
indeksbladsknuder. Kompleksiteten vil væreO(n + log m)
-
IN
er normalt implementeret som en serie (loop) afn
"range scans" på det primære nøgleindeks. Medm
er størrelsen af tabellen, vil kompleksiteten altid væreO(n * log m)
... hvilket altid er værre (ubetydeligt for meget små tabellerm
eller meget små områdern
)
Indeks kan ikke bruges (n
er en betydelig del af m
)
Under alle omstændigheder får du en fuld tabelscanning og evaluerer prædikatet på hver række:
-
BETWEEN
skal evaluere to prædikater:Et for den nedre og et for den øvre grænse. Kompleksiteten erO(m)
-
IN
skal højst evalueren
prædikater. Kompleksiteten erO(m * n)
... hvilket igen altid er værre, eller måskeO(m)
hvis databasen kan optimereIN
liste til at være et hashmap, snarere end en liste over prædikater.