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
列表优化为哈希图,而不是谓词列表,则可能更糟。



