Имея две секционированные таблицы (обе с псевдостолбцом _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 ГБ.
Перелистывание JOIN-заказа на
FROM tab2 JOIN tab1
приводит к обработке ~ 60 ГБ. Очевидно, фильтр 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"
Это обрабатывает ~ 100 МБ.
Является ли это поведение (распространение pt фильтра только в первую таблицу) каким-либо способом желательным или ожидаемым? Может быть, есть какие-то хитрости для достижения этого только с одним pt фильтром? Или может я что-то упустил?
Упомянутый запрос был предназначен для создания представления, которое будет запрашиваться с помощью фильтра pt.
Обратите внимание, что я использую стандартный SQL.