我想知道在字段或join中使用子查询哪个查询的性能更好。
例如,我有两个表book&author(它们之间的一对多关系为author1->*book)。
Sub Query in field (fetching author name using subquery):
select
b.book_id,
b.book_name,
b.author_id,
(select author_name from author where author.id=b.author_id as author_name
from book b
Join Query (fetching author name by joining book & author tables):
select
b.book_id,
b.book_name,
b.author_id,
a.author_name
from book b inner join author a on b.author_id = a.author_id
我使用的是postgres数据库,如果我检查查询计划,那么join将执行嵌套循环,而子查询只使用pk author\u id。
1条答案
按热度按时间jogvjijk1#
它们做不同的事情。与第一个查询等价的是左连接,而不是内部连接。只有在你能保证的情况下,它们才是等价的
author
从来没有超过一个匹配。此外,如果
author
对于给定的行,返回多行author_id
.所以,你应该使用你想要的版本。
也就是说,如果您有两个等价的查询版本(使用
left join
),那么执行计划应该非常相似。特别是,两者都将利用authors(author_id)
--从性能的Angular 来看,这才是你真正关心的。