Sql 具有大型表的通用表表达式(CTE)
考虑使用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: 对于大
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的局限性。