普通联接与子查询联接

时间:2020-08-05 05:03:24

标签: sql postgresql performance

使用联接查询的最佳方法是什么?

  1. 首先联接表,然后在何处添加条件
  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 
         

1 个答案:

答案 0 :(得分:1)

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

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

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

注意:某些数据库(例如MySQL和MS Access)没有非常好的优化器,而此类查询的确产生了不同的执行计划。 las。