Ответ 1
BETWEEN
должен превзойти IN
в этом случае (но также измерять и проверять планы выполнения!), тем более, что n
растет, а статистика по-прежнему точна. Предположим, что
-
m
- размер вашей таблицы. -
n
- размер вашего диапазона.
Индекс может использоваться (n
является крошечным по сравнению с m
)
-
Теоретически,
BETWEEN
может быть реализовано с одним "сканированием диапазона" (Oracle говорят) по индексу первичного ключа, а затем пересекает не болееn
узлы листа индекса. Сложность будетO(n + log m)
-
IN
обычно реализуется как серия (цикл) сканированияn
"диапазона индекса первичного ключа. Если размерm
равен размеру таблицы, всегда будетO(n * log m)
..., что всегда хуже (небрежно для очень маленьких таблицm
или очень малых диапазоновn
)
Индекс не может быть использован (n
является значительной частью m
)
В любом случае вы получите полное сканирование таблицы и оцените предикат в каждой строке:
-
BETWEEN
необходимо оценить два предиката: один для нижнего и один для верхней границы. СложностьO(m)
-
IN
необходимо оценить не более префиксовn
. СложностьO(m * n)
... которая всегда всегда хуже или возможноO(m)
, если база данных может оптимизировать списокIN
как хэш-карту, а не список предикатов.