BigQuery分区表加入_PARTITIONTIME

问题描述 投票:1回答:1

有两个分区表(都有伪列_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。

google-cloud-platform google-bigquery
1个回答
1
投票

这种优化已经实施,现在已得到支持。

© www.soinside.com 2019 - 2024. All rights reserved.