You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:14:26