繁体   English   中英

具有大表的公用表表达式 (CTE)

[英]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:

如果t1t2是无法存储在内存中的大表,它们是否会被写入磁盘使查询变慢?

问题 3:

对于大表应该避免这种类型的查询吗?

答案:

  1. 是的。 在 PostgreSQL v11 之前,CTE 在 PostgreSQL 中具体化。 这在 v12 中发生了变化,从那个版本开始,您的查询可能会表现得更好。

    您可以EXPLAIN查询来验证。

  2. 是的。

  3. 是的。

  1. 不。您实际上可以添加更多 cte 而不是在底部的选择中使用它们,它们没有任何效果。 查询优化器将它们转换为最有效的连接并一起执行。 因此,CTE 比临时表更好更快。

  2. 这可能是临时表的问题,但 CTE 没有问题。 CTE 只是表示数据的表达式,在优化器知道您如何选择它们之前不会被调用。

  3. 不。 事实上,如果你的桌子很大,这是代替诱惑桌子的方法。 如果您设置了适当的索引,表大小应该无关紧要。 CTE 使您不必处理稍后将在查询中过滤掉的记录。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM