为什么这个oracle查询这么慢?

时间:2016-01-07 05:36:47

标签: sql oracle performance

我有一个非常大的表,我需要采用满足这些要求的各行:

  • 在第1列和第2列中重复了多个具有相同值的行
  • 或第3列大于5
TABLE:

id  c1  c2  c3  c4  c5
1   101 102 1   2   3
2   101 102 3   2   1
3   105 104 6   0   1
4   103 108 2   0   0


RESULTS:

id  c1  c2  c3  c4  c5
1   101 102 1   2   3
2   101 102 3   2   1
3   105 104 6   0   1

QUERY

SELECT * FROM table
  WHERE ((column1, column2) IN (
                                  SELECT column1, column2 FROM table
                                    WHERE ...
                                    GROUP BY column1, column2
                                    HAVING COUNT(*) > 1
                                )
        )
        OR column3 > 5;
  • 我正在使用Oracle SQL Developer
  • 这个查询花了很多时间我必须取消它,但是如果我删除'OR column3> 5'查询以6秒结束

我想知道此查询的内部功能,以了解发生了什么以及为什么需要花费这么多时间。

最好的方法是什么?

谢谢你,对不起我的英语。

1 个答案:

答案 0 :(得分:1)

尝试消除in子句的分析查询。它可以更快,因为它将消除连接。如果有条件,则应在嵌套查询中应用

select distinct * from (
  select t.*, count(1) over (partition by column1, column2) cnt
  from table t where ...)
where cnt > 1

如果您在column1和column2上有索引,那么您的查询可能会运行得更快。它将执行全表扫描,也可能执行散列连接。如果您可以分享解释计划,我可以指出问题。