Trino/Presto SQL(Athena)中CTE场景下Projection Pushdown是否生效?
Projection Pushdown在CTE场景下的生效情况分析
先看你给出的查询语句:
WITH data_table AS ( SELECT * FROM table ) SELECT id FROM data_table
核心结论
绝大多数现代查询引擎(如PostgreSQL、Spark SQL、BigQuery、MySQL 8.0+等)都会正常应用Projection Pushdown,只会扫描并加载表中的id列,不会读取所有列造成内存浪费。
具体原因
查询引擎的优化器会执行逻辑查询重写,把CTE的定义和外层查询合并,最终等价于直接执行:
SELECT id FROM table
优化器能识别出最终仅需id列,会忽略CTE里的SELECT *,将投影操作下推到数据源扫描阶段,只读取目标列。
例外场景
少数情况Projection Pushdown可能不生效:
- 部分老版本数据库(如MySQL 5.x)对CTE的优化支持有限,会先执行CTE的
SELECT *读取全列,再过滤出id列; - 如果CTE被显式标记为
MATERIALIZED(比如PostgreSQL的WITH data_table AS MATERIALIZED (...)),引擎会先物化CTE结果(读取所有列),再从物化结果中提取id列,此时投影下推不生效。
内容的提问来源于stack exchange,提问作者Shankar ARUL
相关产品推荐
相关产品推荐

