2013-04-29 40 views
6

WHERE IN子句中的值的顺序是否重要? (这是火鸟SQL如果是重要的)SQL中的项目顺序:WHERE IN()很重要吗?

如做:

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) 
+0

我删除了'delphi'标签,因为你的问题与Delphi完全无关。请仅使用实际适用于您问题的标签;标签的目的是将问题分类。谢谢。 – 2013-04-29 01:56:21

+0

我的猜测是,除非IN列表很大,否则在现代硬件上没有明显的差异,因为在一天结束时必须有一个for循环,它将遍历该列表的元素并将它们与字段值。 – 2013-04-29 01:59:40

+0

感谢您不确定for循环是否会导致不必要的索引遍历,而且无论如何也无法对列表进行排序。 Thx – 2013-04-29 02:11:01

回答

1

是会,但可能在实现依赖性。 IN被处理为顺序OR,并且可以假定最可能的处理顺序是写入的。这就是说,我首先假定优化器将按照给定的顺序处理元素,因为这是最简单的,并将它们排列在集合中,从最可能到最不可能。它不会伤害,并且很可能会有所帮助。这种差异是可衡量的还是显着的是另一回事;衡量它,让我们知道。

+0

我不确定它是否会迫使索引来回移动它已经检查过的区域(比如分散的硬盘驱动器),或者它是否自行排序,因此我不需要花费时间排序。我将运行测试以找出答案。 – 2013-04-29 02:09:08

+0

似乎没有明显的差异,或者差异太小而无法在我做的测试中测量。 – 2013-04-30 05:29:01

+0

@ChrisValentine:毫不奇怪。如果这个集合变大了,我会把它放在一个查找表中,添加一个聚集索引,然后内联到它。我相信SQL优化器总是可以比OR更有效地执行这样的连接。毕竟,OR函数只是一个语法糖,对于一个集合来说太小而不能放在桌子上。 – 2013-04-30 05:33:50