【问题标题】:Does the order of JOIN vs WHERE in SQL affect performance?SQL 中 JOIN 与 WHERE 的顺序会影响性能吗?
【发布时间】:2020-04-14 06:54:55
【问题描述】:

在 SQL 中,JOIN 与 WHERE 的顺序对查询的性能有多大影响?

a) SELECT […] FROM A JOIN ( SELECT […] FROM B WHERE CONDITION )开启 […]

b) SELECT [...] FROM A JOIN ( SELECT [...] FROM B ) ON [...] WHERE CONDITION

我的内心感觉告诉我选项 a) 应该更高效:如果我们先执行连接,然后运行 ​​where,它的性能似乎比首先在一个表上运行 where 并从结果中执行 a加入。但我不确定,因为这取决于 SQL 库本身的内部优化。

很高兴知道 MySQL 和 MySQL 的行为是否相同 PostgreSQL,以及它是否依赖于任何其他装饰器,如 group byorder by

【问题讨论】:

标签: mysql sql postgresql join where-clause


【解决方案1】:

Postgres 有一个智能优化器,因此在大多数情况下,两个版本应该有相似的执行计划(我稍后会回到那个)。

MySQL 倾向于实现子查询。尽管这在最近的版本中变得更好,但我仍然建议避免使用它。实现子查询会阻止索引的使用,并且会对性能产生重大影响。

一个警告:如果子查询很复杂,那么作为子查询的一部分进行过滤可能会更好。例如,如果它是一个聚合,那么在聚合之前过滤通常会带来更好的性能。也就是说,Postgres 很聪明地将条件推送到子查询中。因此,如果外部过滤是在聚合中使用的键上,Postgres 足够聪明,可以将条件推送到子查询中。

【讨论】:

    【解决方案2】:

    在所有其他因素相同的情况下,我希望 A 版本的性能优于 B 版本,正如您似乎也期望的那样。主要原因是 A 版本允许数据库在子查询中使用WHERE 子句丢弃行。然后连接只需要涉及一个较小的中间表。两者之间的确切性能差异将取决于基础数据和实际查询。请注意,甚至有可能两个查询都可以在后台优化为相同或非常相似的执行计划。

    【讨论】:

    • 这些对于相同的实现是微不足道的优化,并且没有理由在不参考 EXPLAIN 输出、记录的优化或实际 DBMS 版本实施的情况下接受任何特定的执行模型,这个答案只会误导。跨度>
    • @philipxy 好吧,这就是我在没有看到实际查询的情况下所能说的(我的回答给出了这个免责声明)。
    猜你喜欢
    • 2015-04-17
    • 1970-01-01
    • 2011-05-01
    • 2017-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-18
    相关资源
    最近更新 更多