SQL: WHERE IN () 中项的顺序是否重要?

7

在 WHERE IN 子句中,值的顺序是否重要?(这是 Firebird SQL 的问题)

例如,以下语句是否相同:

where field1 in (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

提供比...更高的性能水平
where field1 in (3, 5, 10, 2, 1, 8, 6, 9, 4, 7)

我删除了 delphi 标签,因为你的问题与 Delphi 毫无关系。请仅使用实际适用于您问题的标签;标签的目的是将问题分类到相应的类别中。谢谢。 - Ken White
我的猜测是,除非 IN 列表很大,在现代硬件上它不会有任何显着的差异,因为归根结底必须有一个 for 循环来迭代该列表的元素并将它们与字段值进行比较。 - Mike Trusov
谢谢,我不确定for循环是否会以某种重要的方式导致不必要的索引遍历,或者它是否无论如何都会对列表进行排序。谢谢。 - Chris Valentine
1个回答

2

是的,但实现方式可能会有所不同。IN 被处理为连续的 OR,最可能的处理顺序应该是按照书写顺序。

即便如此,我会首先假设优化器会按给定的顺序处理元素,因为这样最简单,并将它们在集合中从最可能到最不可能进行排名。这样做并不会有坏处,很可能会有帮助。但是否差异有显著的可测量性则是另一个问题;请进行测量并告知我们。


我不确定它是否会强制索引来回移动,遍历已经检查过的区域(就像碎片化的硬盘),还是它会自己先进行排序,所以我不需要花时间再进行排序。我将运行测试来找出答案。 - Chris Valentine
似乎没有明显的差异,或者差异太小以至于在我进行的测试中无法测量。 - Chris Valentine
@ChrisValentine:毫不奇怪。如果集合变得很大,我会将其放入查找表中,并添加一个聚集索引,然后进行内连接。我相信SQL优化器总是能够比OR更高效地执行这样的连接操作。毕竟,OR函数只是一种语法糖,用于处理那些太小而不值得放入表中的集合。 - Pieter Geerkens

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接