繁体   English   中英

Big Query 在相同的查询性能上使用 CTE 两次

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM