Big Query中同一查询两次调用CTE会重复执行吗?
问题:BigQuery中同一CTE在单语句内多次引用会重复执行吗?
用户提供的简化查询语句:
WITH test AS ( SELECT 1 AS fieldA, 2 AS fieldB ) SELECT fieldA, fieldB FROM test UNION ALL SELECT fieldB, fieldA FROM test;
用户疑问:我此前了解CTE仅在单个SQL语句中生效,但此场景为单语句内两次使用同一CTE,未找到相关说明。实际场景中CTE会更复杂,包含ROW_NUMBER窗口函数与JOIN,想知道BigQuery会两次执行test CTE,还是仅执行一次并在UNION ALL的两个部分共享数据?
解答
在BigQuery中,对于这类确定性的CTE(即不包含随机函数、不依赖外部动态数据或会话变量的CTE),查询优化器会默认将其执行一次并复用结果,不会重复执行两次。
如果你的CTE包含RAND()这类非确定性函数,或者依赖会话级变量、外部动态数据源,BigQuery才可能会多次执行该CTE。但对于包含ROW_NUMBER()窗口函数、JOIN的常规复杂CTE,只要逻辑是确定性的,优化器都会选择只计算一次,然后在UNION ALL的两个分支中共享数据。
你可以通过查看查询的执行计划来验证:在BigQuery控制台运行查询后,切换到「Execution」标签,会看到test CTE对应的计算步骤只会出现一次,两个SELECT分支都会引用这个步骤的输出。
内容的提问来源于stack exchange,提问作者Ido Barash
相关产品推荐
相关产品推荐

