[英]Big Query using a CTE twice on the same query performance
让我们假设我有类似以下用于大查询的简化查询:
WITH test AS (
SELECT 1 AS fieldA, 2 AS fieldB
)
SELECT fieldA, fieldB
FROM test
UNION ALL
SELECT fieldB, fieldA
FROM test;
Big Query 会运行test
CTE 两次还是只运行一次,然后在联合的两个部分之间共享数据?
我在发布之前进行了搜索,我知道 CTE 查询仅适用于一个 SQL 语句。 但是在这里 - 只有一个语句两次使用相同的 CTE,我找不到类似的东西。
当然,CTE 查询在现实生活场景中更为复杂,可能包含 ROW NUMBER window function 和 JOINS。
非常感谢。
对于with
子句 (CTE) 中的表, 文档很清楚。
BigQuery 仅具体化递归 CTE 的结果,但不会具体化 WITH 子句内的非递归 CTE 的结果。 如果在查询中的多个位置引用了非递归 CTE,则 CTE 对每个引用执行一次。
这可以通过添加带有rand()
的列来测试。 对于每种用途,它都有自己的价值。
WITH RECURSIVE test AS (
SELECT "normal" AS fieldA, 2 AS fieldB, RAND() AS R),
test_recursive AS
(SELECT "recursive" , 9, RAND() AS R
UNION ALL SELECT * FROM test_recursive
WHERE FALSE )
SELECT * FROM test
UNION ALL SELECT * FROM test
UNION ALL SELECT * FROM test
UNION ALL SELECT * FROM test
UNION ALL SELECT * FROM test_recursive
UNION ALL SELECT * FROM test_recursive
UNION ALL SELECT * FROM test_recursive
order by 1
所有真正的递归 CTE 对随机 CTE 具有相同的值。 因此,CTE 只计算了一次。
此查询还表明,每个 CTE 都可以通过两个额外的行来实现。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.