【发布时间】:2018-05-21 03:10:36
【问题描述】:
我正在针对 Sakila 数据库进行测试,请参阅 http://www.postgresqltutorial.com/postgresql-sample-database/。该数据库包含三个关系:
- 电影:film_id、标题
- 演员:actor_id、名字
- film_actor:film_id、actor_id
我想列出所有电影,对于每部电影,我想列出在该特定电影中扮演的所有演员。我以以下查询结束:
select film_id, title, array
(
select first_name
from actor
inner join film_actor
on actor.actor_id = film_actor.actor_id
where film_actor.film_id = film.film_id
) as actors
from film
order by title;
从概念上讲,这是一个1 + n 查询:
one query: get films
n queries: for each film f
f.actors = array(get actors playing in f)
我一直认为应该不惜一切代价避免 1 + n 个查询,因为这不能很好地扩展。
所以这让我想知道:PostgreSQL 是如何在内部实现这一点的?假设我们有 1000 部电影,它是否在内部执行 1000 个select actor.first_name from actor inner join ... 查询?或者 PostgreSQL 在这方面更聪明,它会像下面这样吗?
1. one query: get films
2. one query: get actors related to these films while keeping reference to film_id
3. internally: for each film f
f.actors = array(subset of (2) according to film_id)
这会执行 1 + 1 个查询。
【问题讨论】:
-
太棒了!我不知道存在这样的分析工具。我渴望了解更多。
-
我现在应该如何处理这个问题?我可以开始学习
explain并在几天后回答我的问题吗? -
与您的问题无关的快速提示,但它有助于简化一些查询 - 当仅使用具有相同名称的列连接 2 个表时,您可以使用
using。select * from actor inner join film_actor using(actor_id)
标签: sql postgresql