![](/img/trans.png)
[英]Using MAX and GROUP BY with Common Table Expressions(CTEs) Postgresql
[英]Common table expressions (CTEs) with large tables
考虑使用 CTE 的以下格式的查询:
WITH
t1 AS (SELECT some_data1 FROM some_table),
t2 AS (SELECT some_data2 FROM t1)
SELECT some_data3 FROM t2;
问题 1:
当执行查询时,临时表t1
完全构建并保存在内存中,然后t2
完全基于来自t1
的数据构建,然后SELECT
可以针对t2
运行?
问题2:
如果t1
和t2
是无法存储在内存中的大表,它们是否会被写入磁盘使查询变慢?
问题 3:
对于大表应该避免这种类型的查询吗?
答案:
是的。 在 PostgreSQL v11 之前,CTE 在 PostgreSQL 中具体化。 这在 v12 中发生了变化,从那个版本开始,您的查询可能会表现得更好。
您可以EXPLAIN
查询来验证。
是的。
是的。
不。您实际上可以添加更多 cte 而不是在底部的选择中使用它们,它们没有任何效果。 查询优化器将它们转换为最有效的连接并一起执行。 因此,CTE 比临时表更好更快。
这可能是临时表的问题,但 CTE 没有问题。 CTE 只是表示数据的表达式,在优化器知道您如何选择它们之前不会被调用。
不。 事实上,如果你的桌子很大,这是代替诱惑桌子的方法。 如果您设置了适当的索引,表大小应该无关紧要。 CTE 使您不必处理稍后将在查询中过滤掉的记录。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.