有两个分区表(都带有伪列_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。
答案 0 :(得分:1)
已经实现了这种优化,并且现在已经支持。