BETWEEN
bör överträffa IN
i det här fallet (men gör mäta och kontrollera utförandeplaner också!), särskilt som n
växer och eftersom statistiken fortfarande är korrekt. Låt oss anta:
m
är storleken på ditt bordn
är storleken på ditt intervall
Index kan användas (n
är liten jämfört med m
)
-
I teorin,
BETWEEN
kan implementeras med en enda "räckviddsskanning" (Oracle speak) på primärnyckelindexet och sedan gå igenom högstn
indexbladsnoder. Komplexiteten kommer att varaO(n + log m)
-
IN
implementeras vanligtvis som en serie (loop) avn
"räckviddssökningar" på primärnyckelindexet. Medm
eftersom tabellens storlek är komplexiteten alltidO(n * log m)
... vilket alltid är värre (försumbart för mycket små tabellerm
eller mycket små intervalln
)
Index kan inte användas (n
är en betydande del av m
)
I vilket fall som helst får du en fullständig tabellskanning och utvärderar predikatet på varje rad:
-
BETWEEN
måste utvärdera två predikat:ett för den nedre och ett för den övre gränsen. Komplexiteten ärO(m)
-
IN
behöver utvärdera som mestn
predikat. Komplexiteten ärO(m * n)
... vilket återigen alltid är värre, eller kanskeO(m)
om databasen kan optimeraIN
lista för att vara en hashmap, snarare än en lista med predikat.