与在执行查询之前消除重复项相比,IN
子句中是否有重复参数会影响查询的性能?
SELECT * FROM table WHERE column IN ('A', 'B', 'C', 'A', 'A')
VS
SELECT * FROM table WHERE column IN ('A', 'B', 'C')
我通过Java以编程方式汇编查询,并且正在权衡我是否应该使用
我假设表现可能并不重要,但想知道前进的最佳做法。
答案 0 :(得分:2)
重复不会以明显的方式降低性能,至少不会单独降低性能。但是,如果查询之间的项目数发生变化,则可能会对性能产生间接影响,从而迫使在服务器端重新计算查询计划。
假设您的查询已参数化,并且IN
列表元素的数量存在已知限制,最好在准备好的查询中包含固定数量的参数,并绑定NULL
s对IN
列表的未使用元素(包含或不包含重复项),而不是始终重新生成查询。
如果你的查询没有参数化(要非常小心),你最好不仅要删除重复项,还要以相同的方式订购你的独特项目(例如,使用TreeSet
)。否则,IN
和('A', 'B', 'C')
的{{1}}列表的查询将被视为不同,从而触发重新计算查询计划。
如果保留重复项,可能会遇到的另一个问题是('A', 'C', 'B')
列表的最大长度。 Oracle将限制设置为大约一千,因此即使唯一项的数量在允许的最大值内,重复列表也可能超过限制。