Sql 具有大型表的通用表表达式(CTE)

Sql 具有大型表的通用表表达式(CTE),sql,postgresql,common-table-expression,query-performance,Sql,Postgresql,Common Table Expression,Query Performance,考虑使用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: 对于大

考虑使用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:

对于大型表,是否应该避免这种类型的查询

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

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

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

答复:

对。直到PostgreSQL v11,CTE都在PostgreSQL中具体化。这将在v12中进行更改,从该版本开始,您的查询可能会执行得更好

您可以解释查询以验证这一点

我想推荐Craig Ringer,让他更了解CTE的局限性。