BigQuery分区表在_PARTITIONTIME联接

时间:2018-09-03 11:45:36

标签: google-cloud-platform google-bigquery

有两个分区表(都带有伪列_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。 翻转加入订单以

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。

1 个答案:

答案 0 :(得分:1)

已经实现了这种优化,并且现在已经支持。