BETWEEN
sollte IN
übertreffen in diesem Fall (aber tun auch Ausführungspläne messen und prüfen!), insbesondere als n
wächst und da Statistiken immer noch genau sind. Nehmen wir an:
m
ist die Größe Ihres Tischesn
ist die Größe Ihres Sortiments
Index kann verwendet werden (n
ist winzig im Vergleich zu m
)
-
Theoretisch
BETWEEN
kann mit einem einzigen "Bereichsscan" (Oracle-Sprache) auf dem Primärschlüsselindex implementiert werden und dann höchstensn
durchlaufen Indexblattknoten. Die Komplexität istO(n + log m)
-
IN
wird normalerweise als eine Reihe (Schleife) vonn
implementiert "Bereichsscans" auf dem Primärschlüsselindex. Mitm
Da es sich um die Größe der Tabelle handelt, ist die Komplexität immerO(n * log m)
... was immer schlimmer ist (vernachlässigbar für sehr kleine Tabellenm
oder sehr kleine Bereichen
)
Index kann nicht verwendet werden (n
ist ein wesentlicher Teil von m
)
In jedem Fall erhalten Sie einen vollständigen Tabellenscan und werten das Prädikat für jede Zeile aus:
-
BETWEEN
muss zwei Prädikate auswerten:Eines für die untere und eines für die obere Grenze. Die Komplexität istO(m)
-
IN
muss höchstensn
auswerten Prädikate. Die Komplexität istO(m * n)
... was wiederum immer schlimmer ist, oder vielleichtO(m)
ob die Datenbank denIN
optimieren kann Liste als Hashmap und nicht als Liste von Prädikaten.