【问题标题】:Why is it so slow this oracle query?为什么这个 oracle 查询这么慢?
【发布时间】:2016-01-07 05:36:47
【问题描述】:

我有一个很大的表,我需要获取满足这些要求的各个行:

  • 在第 1 列和第 2 列中重复了多行具有相同值的行
  • 或第 3 列大于 5
桌子: 编号 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 结果: 编号 c1 c2 c3 c4 c5 1 101 102 1 2 3 2 101 102 3 2 1 3 105 104 6 0 1 询问 选择 * 从表 WHERE ((column1, column2) IN ( 从表中选择第 1 列、第 2 列 在哪里 ... 按第 1 列、第 2 列分组 计数 (*) > 1 ) ) 或列 3 > 5;
  • 我正在使用 Oracle SQL Developer
  • 此查询需要很长时间,我不得不取消它,但如果我删除“OR column3 > 5”,查询将在 6 秒内结束

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

最好的方法是什么?

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

【问题讨论】:

  • 嗨@SOF 你制定了解释计划吗?

标签: sql oracle performance


【解决方案1】:

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

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

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

【讨论】:

  • 非常感谢它有效! :) 但我还是不明白为什么我的查询这么慢 ;(
  • 如果在 column1 和 column2 上添加索引,可能会更快。
  • HAVING COUNT(*) > 1 工作缓慢,因为它会检索所有记录然后过滤。
猜你喜欢
  • 2020-03-19
  • 2013-06-04
  • 2011-03-11
  • 2014-03-12
  • 2011-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多