【问题标题】:Normal Join vs Join with Subqueries普通连接与使用子查询连接
【发布时间】:2020-08-05 05:03:24
【问题描述】:

使用连接进行查询的最佳方式是什么?

  1. 先连接表,然后添加 where 条件
  2. 先用子查询添加where条件再加入

例如以下哪个查询的性能更好?

select * from person persons
         inner join role roles on roles.person_id_fk = persons.id_pk 
         where roles.deleted is null

select * from person persons
         inner join (select * from role roles where roles.deleted is null) as roles
         on roles.person_id_fk = persons.id_pk 
         

【问题讨论】:

  • 第一个版本应该性能更好,因为它避免了显式子查询。出于教育目的,您应该在这两个查询上运行 EXPLAIN,以亲自了解 Postgres 将如何评估每个查询。
  • @Bawpotter 不,我想要最好的连接方式,但这个问题是关于查询执行的顺序。
  • 如果有任何区别,我会感到非常惊讶。我很确定execution plan 对于两者都是相同的

标签: sql postgresql performance


【解决方案1】:

在一个体面的数据库中,两个查询之间应该没有区别。请记住,SQL 是一种描述性 语言,而不是一种过程 语言。也就是说,一条 SQL SELECT 语句描述了应该返回的结果集。它没有指定创建它的步骤。

您的两个查询在语义上是等效的,SQL 优化器应该能够识别这一点。

当然,SQL 优化器并非无所不知。因此,有时您编写查询的方式确实会影响执行计划。但是,您描述的查询被转换为没有“子查询”概念的执行计划,因此它们会产生相同的执行计划是合理的。

注意:一些数据库——比如 MySQL 和 MS Access——没有很好的优化器,这样的查询会产生不同的执行计划。唉。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-13
    • 2013-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多