具有重复IN参数的SQL查询性能

时间:2015-05-27 03:01:05

标签: java sql oracle

与在执行查询之前消除重复项相比,IN子句中是否有重复参数会影响查询的性能?

SELECT * FROM table WHERE column IN ('A', 'B', 'C', 'A', 'A')

VS

SELECT * FROM table WHERE column IN ('A', 'B', 'C')

我通过Java以编程方式汇编查询,并且正在权衡我是否应该使用

  1. 自动防止重复的设置;
  2. 使用列表但每次尝试插入时都包含call;
  3. 只需添加并不介意重复的字符串数据
  4. 我假设表现可能并不重要,但想知道前进的最佳做法。

1 个答案:

答案 0 :(得分:2)

重复不会以明显的方式降低性能,至少不会单独降低性能。但是,如果查询之间的项目数发生变化,则可能会对性能产生间接影响,从而迫使在服务器端重新计算查询计划。

假设您的查询已参数化,并且IN列表元素的数量存在已知限制,最好在准备好的查询中包含固定数量的参数,并绑定NULL s对IN列表的未使用元素(包含或不包含重复项),而不是始终重新生成查询。

如果你的查询没有参数化(要非常小心),你最好不仅要删除重复项,还要以相同的方式订购你的独特项目(例如,使用TreeSet)。否则,IN('A', 'B', 'C')的{​​{1}}列表的查询将被视为不同,从而触发重新计算查询计划。

如果保留重复项,可能会遇到的另一个问题是('A', 'C', 'B')列表的最大长度。 Oracle将限制设置为大约一千,因此即使唯一项的数量在允许的最大值内,重复列表也可能超过限制。