Использование подзапроса для _PARTITIONTIME в bigquery не ограничивает стоимость - PullRequest
0 голосов
/ 10 января 2019

Когда я запускаю приведенный ниже запрос на BQ с использованием стандартного SQL, он говорит, что при работе

он обработает 76,6 ТБ
SELECT 
event_time, user_id, activity_id,dbm_insertion_order_id, dbm_total_media_cost_usd 
FROM `raw.5295.activity_*`
WHERE _PARTITIONTIME >(SELECT * FROM `analytics-dwh.autobidding.activity_list` )
AND timestamp_micros(event_time)  > (SELECT timestamp_micros(MAX(event_time)) from `essence-analytics-dwh.ml_for_autobidding.nest_na_4q18_activity_updated_daily`)
AND _TABLE_SUFFIX IN ('25','20')

Таблица analytics-dwh.autobidding.activity_list содержит только один столбец с уникальным списком целых чисел

Если я удаляю подзапрос из приведенной выше таблицы, запрос использует менее 500 ГБ при запуске

SELECT 
event_time, user_id, activity_id,dbm_insertion_order_id, dbm_total_media_cost_usd 
FROM `raw.5295.activity_*`
WHERE _PARTITIONTIME >TIMESTAMP('2018-12-20')
AND timestamp_micros(event_time)  > (SELECT timestamp_micros(MAX(event_time)) from `essence-analytics-dwh.ml_for_autobidding.nest_na_4q18_activity_updated_daily`)
AND _TABLE_SUFFIX IN ('25','20')

Почему это происходит, когда я использую подзапрос? Есть ли обходной путь?

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Почему это происходит с использованием подзапроса?

Как правило, удаление разделов снижает стоимость запроса, когда фильтры могут быть оценены в самом начале запроса, не требуя оценки подзапроса или сканирования данных.

Вы можете увидеть больше о Ограничение разделов, запрашиваемых с использованием псевдостолбцов

Итак, в вашем первом запросе (где вы используете подзапрос) - отсечение не происходит (оно не ограничивает использование разделов на основе условия, которое включает подзапрос)

Во втором запросе вы используете _PARTITIONTIME >TIMESTAMP('2018-12-20'), поэтому количество разделов ограничено

Итог: фильтры в _PARTITIONTIME, включающие подзапросы, не могут использоваться для ограничения количества проверяемых разделов для многораздельной таблицы.

Есть ли обходной путь?

Вы должны разделить свою задачу на два этапа: вычислить фильтр для _PARTITIONTIME, используя любую логику, которая вам нужна, вне таблицы analytics-dwh.autobidding.activity_list, а затем использовать ее (вместо подзапроса) - используя любой клиент по вашему выбору

0 голосов
/ 11 января 2019

Рассматривая ваш запрос, я предполагаю, что вы хотите выбрать минимальную или максимальную дату из этого:

SELECT * FROM `analytics-dwh.autobidding.activity_list`

И передать его во 2-ю часть вашего запроса

Это можно сделать с помощью BigQuery API внутри кода, который будет передавать значение между двумя шагами (например, Python или Javascript)

...