哪个查询有更好的性能?
Posted
技术标签:
【中文标题】哪个查询有更好的性能?【英文标题】: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)
我的问题:
-
第一个查询是否需要将所有行放入
BigMillionTable
在主内存中执行UNION ALL
?
哪个查询提供更好的性能?
【问题讨论】:
你尝试的时候发生了什么?但如果 Oracle 选择对这两个语句使用不同的执行计划,我会感到非常惊讶。 比较解释计划。有什么区别吗? 第一个查询的性能要好得多,因为它由于花括号语法错误而立即失败。修复它之后,Oracle 很可能会取消嵌套子查询,您将看到相同的 execution plan. 在 Sigmod 2018 上有一篇不错的文章,与该主题的 TeraData 相关。你应该阅读它:web.cs.wpi.edu/~meltabakh/Publications/… 【参考方案1】:where 条件实际上是在选择之前执行的,因此在第二个查询中,您只是在一个较小的集合上进行联合,所以应该更快。
在第一个查询中,内部查询将首先运行,它将对整个表进行联合,然后在选择记录之前执行 where。
所以是的,与第一个相比,第二个会提供更好的性能
【讨论】:
您的建议可能与某些 RDBMS 甚至某些 Oracle 的古老版本相匹配。腾讯版本可以进行查询转换来避免此类问题,因此您应该在发布之前对其进行测试并提供差异证据。 即使是查询转换也需要额外的时间,第二个查询不会遇到 @SushantSharma 。 . .我希望 Oracle 优化器足够聪明,可以将过滤条件推送到union all
子查询中。这是具有良好优化器的数据库完成的一件事。
那个 periscopedata 链接应该被禁止 - 它非常具有误导性以上是关于哪个查询有更好的性能?的主要内容,如果未能解决你的问题,请参考以下文章
Statement和PreparedStatement有什么区别?哪个性能更好?预编译语句,防止sql注入问题