3

通过缓存,我的意思是是否对每个获取的行都调用子查询?

几个例子

-- 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;
4

1 回答 1

4

关于FROM子句中的子查询:

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

在您介绍的三种情况下,PostgreSQL 甚至会展平子查询:优化器意识到子查询是不必要的,并相应地转换查询。

与您的查询一起使用EXPLAIN以查看实际情况。

关于 CTE:

与子句中的子查询不同FROM,CTE 充当优化屏障,即优化器不会尝试将其展平或将条件推入其中。

相反,执行 CTE 并将结果物化,并且查询对物化结果执行CTE 扫描

同样,使用EXPLAIN它来查看它的实际效果。

PostgreSQL 社区正在努力消除 CTE 始终实现的限制(或功能,因为它是一种指导优化器的方式)。

于 2018-09-18T07:03:33.963 回答