BigQuery: очень медленное соединение на дату и _table_suffix - PullRequest
0 голосов
/ 24 января 2020

В моем запросе я получу sh, чтобы получить данные из многораздельной таблицы, где каждому пользователю требуется отдельный раздел в зависимости от конкретной для него даты. Это требует от меня, чтобы присоединиться к пользователю и дата = раздел. Это соединение очень и очень медленное. Запущено около 12 минут!

Базовая c структура запроса приведена ниже:

SELECT
 t1.user_id
 ,t1.date
 ,t2.some_field
FROM `t1`   AS t1
JOIN `t2_*` AS t2
 ON t1.user_id = t2.user_id
 AND t2._table_suffix = FORMAT_DATE("%Y%m%d", t1.date)

Как я могу получить тот же результат быстрее?

1 Ответ

1 голос
/ 27 января 2020

Некоторые вещи, которые ускорили этот запрос (с 12 минут до 1 минуты):

  1. Предварительная фильтрация таблицы t2 по разделам, относящимся к объединению, с помощью t1
  2. Добавление поле даты к CTE t2, чтобы сделать соединение с t1 более быстрым

Это выглядит так:

WITH t1_dates AS (
 SELECT
 MIN(date) min_date
 ,MAX(date max_date
 FROM
 `t1`
)

, t2_v2 AS (
 SELECT
 user_id
 ,some_field
 ,PARSE_DATE("%Y%m%d", t2._table_suffix) date

 from t2_*
 ,t1_dates

 where _table_suffix BETWEEN FORMAT_DATE("%Y%m%d",t1_dates.min_date) 
                         AND FORMAT_DATE("%Y%m%d",t1_dates.max_date) 
)

SELECT
 t1.user_id
 ,t1.date
 ,t2.some_field
FROM `t1`   AS t1
JOIN t2_v2 AS t2
 ON t1.user_id = t2.user_id
 AND t2.date = t1.date
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...