在 PostgreSQL 中,我如何知道子查询何时在过滤之前或之后应用?

问题描述 投票:0回答:1

我有这些 SQL 查询:

EXPLAIN ANALYZE
SELECT 
    * ,
    (
        SELECT COUNT(*) FROM orders 
        WHERE orders.customer_id = customers.id
    ) as orders_count
FROM customers
LIMIT 10

该查询的执行计划:

EXPLAIN ANALYZE
SELECT 
    * ,
    (
        SELECT COUNT(*) FROM orders 
        WHERE orders.customer_id = customers.id
    ) as orders_count
FROM customers
ORDER BY id
LIMIT 10

该查询的执行计划:

EXPLAIN ANALYZE
SELECT 
    * ,
    (
        SELECT COUNT(*) FROM orders 
        WHERE orders.customer_id = customers.id
    ) as orders_count
FROM customers
ORDER BY orders_count
LIMIT 10

该查询的执行计划:

如何从这些查询和执行计划中知道子查询“orders_count”何时被计算并分配给表中的每一行,以及何时仅限于前 10 行

鉴于客户表中存在大量记录,我的目标是注释尽可能少的行,而不是注释所有数百万条记录。

sql postgresql subquery
1个回答
1
投票

在解释计划中,第 5 行(最后一行为第 8 行)显示 rows=10,因此看起来 SQL 计划程序能够在子查询中使用该限制。不过,我们看不到该线上的循环数,因此这不是确定的。

然而,第三个在第 7 行显示聚合需要 10000 个循环。由于订单需要子查询,因此没有办法限制它而不计算整个表。

© www.soinside.com 2019 - 2024. All rights reserved.