在 Postgres 12 中,我有一张桌子purchase_orders
和一张桌子items
。我正在运行一个查询,该查询返回给定的 POshop
和每个 PO 上订购的项目的总和:
SELECT po.id,
SUM(grouped_items.total_quantity) AS total_quantity
FROM purchase_orders po
LEFT JOIN (
SELECT purchase_order_id,
SUM(quantity) AS total_quantity
FROM items
GROUP BY purchase_order_id
) grouped_items ON po.id = grouped_items.purchase_order_id
WHERE po.shop_id = 195
GROUP BY po.id
Run Code Online (Sandbox Code Playgroud)
此查询返回所需的结果。JOIN 在一个子查询中,因为会有其他 JOINS 到其他表,所以这会生成一个已经分组的表来连接。
我用相关 SELECT
子查询而不是 JOIN编写了另一个查询。运行这两种方法的执行时间几乎相同,因此很难看出哪个更快。我跑了,EXPLAIN ANALYZE
但不能很好地解释它。
问题:在上面的例子中,Postgres 会处理items
子查询的整个表,并且只有在与purchase_orders
? 或者它是否足够聪明来过滤集合,如果items
首先?
该EXPLAIN
报告提到了“Seq Scan on Items...”,它似乎包含 中的所有行items
,然后随着它向上移动树而减少。但不确定这是否意味着它实际上 …