是否缓存了 PostgreSQL 子查询/CTE?
Are PostgreSQL subqueries / CTE cached?
缓存是指是否为每个获取的行调用子查询?
几个例子
-- 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;
关于FROM
子句中的子查询:
子查询将不会对返回的每一行执行;这在这些情况下毫无意义。
在您提供的三种情况下,PostgreSQL 甚至会展平 子查询:优化器意识到子查询是不必要的,并相应地转换查询。
在您的查询中使用 EXPLAIN
以查看实际效果。
关于 CTE:
与 FROM
子句中的子查询不同,CTE 充当 优化障碍 ,也就是说,优化器不会尝试将其展平或将条件推入它。
而是执行 CTE,结果 具体化,查询对具体化结果执行 CTE 扫描。
再次使用 EXPLAIN
来查看它的实际效果。
PostgreSQL 社区正在努力消除 CTE 始终具体化的限制(或功能,因为它是一种指导优化器的方法)。
缓存是指是否为每个获取的行调用子查询?
几个例子
-- 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;
关于FROM
子句中的子查询:
子查询将不会对返回的每一行执行;这在这些情况下毫无意义。
在您提供的三种情况下,PostgreSQL 甚至会展平 子查询:优化器意识到子查询是不必要的,并相应地转换查询。
在您的查询中使用 EXPLAIN
以查看实际效果。
关于 CTE:
与 FROM
子句中的子查询不同,CTE 充当 优化障碍 ,也就是说,优化器不会尝试将其展平或将条件推入它。
而是执行 CTE,结果 具体化,查询对具体化结果执行 CTE 扫描。
再次使用 EXPLAIN
来查看它的实际效果。
PostgreSQL 社区正在努力消除 CTE 始终具体化的限制(或功能,因为它是一种指导优化器的方法)。