使用联接查询的最佳方法是什么?
例如,以下哪个查询具有更好的性能?
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
答案 0 :(得分:1)
在一个体面的数据库中,两个查询之间应该没有区别。请记住,SQL是一种描述性语言,而不是 procedural 语言。也就是说,SQL SELECT
语句描述了应返回的结果集。它没有指定创建它的步骤。
您的两个查询在语义上是等效的,SQL优化器应该能够识别出来。
当然,SQL优化器不是无所不知的。因此,有时您写查询的方式确实会影响执行计划。但是,您所描述的查询被转换为没有“子查询”概念的执行计划,因此合理的是它们会生成相同的执行计划。
注意:某些数据库(例如MySQL和MS Access)没有非常好的优化器,而此类查询的确产生了不同的执行计划。 las。