PostgreSQL子查询/ CTE是否已缓存?

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

通过缓存我的意思是如果每个获取的行调用子查询?

几个例子

-- Simple query
SELECT * FROM (
    SELECT * FROM accounts
) AS subquery;

-- Subquery with function
SELECT * FROM (
    SELECT AVG(id_groups) FROM accounts
) AS subquery;

-- More messy queries
SELECT * FROM (
  SELECT id_groups, AVG(id_accounts) OVER (PARTITION BY id_groups)
  FROM accounts
) AS subquery
GROUP BY subquery.id_groups, subquery.avg;

而且

两者之间有区别吗?

SELECT * FROM (
    SELECT * FROM accounts
) AS subquery;

WITH everything_about_accounts AS (
    SELECT * FROM accounts
)
SELECT * FROM everything_about_accounts;
postgresql subquery common-table-expression query-performance
1个回答
3
投票

关于FROM子句中的子查询:

返回的每一行都不会执行子查询;在这些情况下这没有任何意义。

在你提出的三种情况下,PostgreSQL甚至会使子查询变平:优化器意识到子查询是不必要的,并相应地转换查询。

使用EXPLAIN查看您的查询。

关于CTE:

FROM子句中的子查询不同,CTE充当优化障碍,也就是说,优化器不会尝试将其展平或将条件推入其中。

而是执行CTE并且结果具体化,并且查询对具体化结果执行CTE扫描。

再次,使用EXPLAIN来看它的实际效果。

PostgreSQL社区正在努力消除限制(或特征,因为它是引导优化器的一种方式),即CTE始终具体化。

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