哪个查询有更好的性能?

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 链接应该被禁止 - 它非常具有误导性

以上是关于哪个查询有更好的性能?的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 查询 - 哪个性能更好?

哪个蜂巢表提供更好的性能?

Statement和PreparedStatement有什么区别?哪个性能更好?预编译语句,防止sql注入问题

SSIS中 merge join与lookup 哪个性能更好些

性能方面:在 Laravel 数据库中哪个更好

SQL 多选一个字段值只选一次 和多次从表里查询但查的字段较少 相比哪个性能更好?为啥?