PostgreSQL如何处理1+n查询?基于Sakila数据库场景解析
关于PostgreSQL中数组子查询执行方式的疑问
我最近在测试Sakila示例数据库,这个库包含三个核心关系:
- film:包含
film_id、title字段 - actor:包含
actor_id、first_name字段 - 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 + 1查询方式来执行?
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)
内容的提问来源于stack exchange,提问作者Jelly Orns
相关产品推荐
相关产品推荐

