BigQuery 分区表在 _PARTITIONTIME 加入
Posted
技术标签:
【中文标题】BigQuery 分区表在 _PARTITIONTIME 加入【英文标题】:BigQuery partitioned tables join on _PARTITIONTIME 【发布时间】:2018-09-03 11:45:35 【问题描述】:有两个分区表(都具有伪列 _PARTITIONTIME)我想在 _PARTITIONTIME 加入它们。然后我想用 _PARTITIONTIME 过滤器查询结果表,但我注意到这个过滤器只传播到 JOIN 语句的第一个表。下面是一个例子。
WITH tab1 AS (
SELECT
_PARTITIONTIME AS pt,
country
FROM
`some_partitioned_table1`
),
tab2 AS (
SELECT
_PARTITIONTIME AS pt,
country
FROM
`some_partitioned_table2`
),
merged_tab AS (
SELECT pt, country
FROM tab1 JOIN tab2
USING (pt, country) )
SELECT *
FROM merged_tab
WHERE pt = "2018-08-12"
在我的情况下,此查询处理 ~26 GB。 将 JOIN 顺序翻转为
FROM tab2 JOIN tab1
导致处理 ~60 GB。显然 pt 过滤器被传播到 JOIN 中的第一个表。 我真正想要实现的是:
WITH tab1 AS (
SELECT
_PARTITIONTIME AS pt,
country
FROM
`some_partitioned_table1`
),
tab2 AS (
SELECT
_PARTITIONTIME AS pt,
country
FROM
`some_partitioned_table2`
),
merged_tab AS (
SELECT t1.pt as pt1, t2.pt as pt2, t1.country
FROM tab1 t1 JOIN tab2 t2
ON t1.pt = t2.pt AND t1.country = t2.country
)
SELECT
*
FROM
merged_tab
WHERE
pt1 = "2018-08-12" AND pt2 = "2018-08-12"
这会处理 ~100MB。 这种行为(将 pt 过滤器传播到仅第一个表)是否以任何方式期望或预期?也许只有一个 pt 过滤器有一些技巧可以实现这一点?或者,也许我错过了什么? 提到的查询旨在创建将使用 pt 过滤器查询的视图。 注意我使用的是标准 SQL。
【问题讨论】:
这看起来像是尚不支持分区修剪的情况。如果您希望得到支持,请通过 issuetracker.google.com/issues/… 提交功能请求。 【参考方案1】:这种优化已经实现,现在支持。
【讨论】:
您能否扩展您的答案并使其更有用?或许提及首次添加此支持的版本号?也许是问题跟踪器的链接或宣布其部署的博客文章?使用edit 链接。 我们逐渐推出了这个功能。从昨天开始,它已向所有用户推出。以上是关于BigQuery 分区表在 _PARTITIONTIME 加入的主要内容,如果未能解决你的问题,请参考以下文章