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 加入的主要内容,如果未能解决你的问题,请参考以下文章

BigQuery - 列出日期分区表的分区?

Bigquery - 选择数据集中的所有表和分区

BigQuery、日期分区表和装饰器

BigQuery 无法识别分区表谓词

BigQuery 表分区

BigQuery 流式传输和分区:_PARTITIONTIME 何时真正评估?