为什么常见的 table 表达式即使在限制结果时也更快?

Why are common table expressions faster even when limiting the result?

我不明白为什么会出现以下查询:

SELECT ref,
article_number,
count(article_number)
FROM invoice
INNER JOIN goods_list USING (invoice_number)
WHERE invoice_owner = 'someone'
GROUP BY invoice_number, article_number
LIMIT 1

比这个慢得多:

WITH base_data AS (
    SELECT invoice_number
    FROM invoice
    WHERE invoice_owner = 'someone'
    LIMIT 1
)

SELECT invoice_number,
    article_number,
    count(article_number)
FROM base_data
INNER JOIN goods_list USING (invoice_number)
GROUP BY invoice_number, article_number

是否在返回整个结果集后应用限制?

第一个查询处理所有 发票所有者的数据。它完成 group by 最后 returns 一行。

第二个查询预先在 CTE 中为发票所有者获取一行。它将那一行连接到另一行 table,然后在更少的行上进行聚合。

因此,第二个查询要快得多也就不足为奇了,因为它为聚合处理的行要少得多。

注意:使用 limit 时还应使用 order by。否则,您可以在代码运行时获得任何匹配的行——您甚至可能在不同的运行中获得不同的行。