BETWEEN
debería superar a IN
en este caso (pero hacer ¡medir y verificar los planes de ejecución también!), especialmente como n
crece y como las estadísticas siguen siendo precisas. Supongamos:
m
es el tamaño de tu mesan
es el tamaño de su rango
Se puede usar el índice (n
es pequeño en comparación con m
)
-
En teoría,
BETWEEN
se puede implementar con un solo "escaneo de rango" (habla de Oracle) en el índice de clave principal, y luego atravesar como máximon
nodos de hoja de índice. La complejidad seráO(n + log m)
-
IN
generalmente se implementa como una serie (bucle) den
"escaneos de rango" en el índice de clave principal. Conm
siendo el tamaño de la tabla, la complejidad siempre seráO(n * log m)
... que siempre es peor (insignificante para tablas muy pequeñasm
o rangos muy pequeñosn
)
No se puede usar el índice (n
es una porción significativa de m
)
En cualquier caso, obtendrá un escaneo completo de la tabla y evaluará el predicado en cada fila:
-
BETWEEN
necesita evaluar dos predicados:uno para el límite inferior y otro para el límite superior. La complejidad esO(m)
-
IN
necesita evaluar como máximon
predicados. La complejidad esO(m * n)
... que de nuevo siempre es peor, o quizásO(m)
si la base de datos puede optimizar elIN
lista para ser un hashmap, en lugar de una lista de predicados.