【问题标题】:Which query has a better performance?哪个查询有更好的性能?
【发布时间】:2019-05-06 21:21:08
【问题描述】:
SELECT *
FROM { SELECT * FROM BigMillionTable UNION ALL SELECT * FROM SmallTensTable } 
WHERE (some_condition)

对比

SELECT * 
FROM BigMillionTable 
WHERE (some_condition)

UNION ALL

SELECT * 
FROM SmallTensTable
WHERE (some_condition) 

我的问题:

  1. 第一个查询是否需要将所有行放入 BigMillionTable 在主内存中执行UNION ALL ?
  2. 哪个查询提供更好的性能?

【问题讨论】:

  • 你尝试的时候发生了什么?但如果 Oracle 选择对这两个语句使用不同的执行计划,我会感到非常惊讶。
  • 比较解释计划。有什么区别吗?
  • 第一个查询的性能要好得多,因为它由于花括号语法错误而立即失败。修复它之后,Oracle 很可能会取消嵌套子查询,您将看到相同的 execution plan.
  • 在 Sigmod 2018 上有一篇不错的文章,与该主题的 TeraData 相关。你应该阅读它:web.cs.wpi.edu/~meltabakh/Publications/…

标签: sql oracle oracle11g query-performance


【解决方案1】:

where 条件实际上是在选择之前执行的,因此在第二个查询中,您只是在一个较小的集合上进行联合,所以应该更快。

在第一个查询中,内部查询将首先运行,它将对整个表进行联合,然后在选择记录之前执行 where。

所以是的,与第一个相比,第二个会提供更好的性能

【讨论】:

  • 您的建议可能与某些 RDBMS 甚至某些 Oracle 的古老版本相匹配。腾讯版本可以进行查询转换来避免此类问题,因此您应该在发布之前对其进行测试并提供差异证据。
  • 即使是查询转换也需要额外的时间,第二个查询不会遇到
  • @SushantSharma 。 . .我希望 Oracle 优化器足够聪明,可以将过滤条件推送到 union all 子查询中。这是具有良好优化器的数据库完成的一件事。
  • 那个 periscopedata 链接应该被禁止 - 它非常具有误导性
猜你喜欢
  • 2015-03-14
  • 1970-01-01
  • 2011-11-24
  • 2011-12-02
  • 2020-05-09
  • 1970-01-01
  • 2017-08-09
  • 1970-01-01
相关资源
最近更新 更多