Я хочу понять логику выполнения и извлечения данных в BigQuery, чтобы писать более эффективные запросы. Представьте, что у меня есть следующие таблицы, каждая из которых содержит большое количество строк:
table_a
: ключ соединения id
, разделенный date_a
и кластеризованный cluster_a
table_b
: ключ соединения id
, разделенный date_b
и кластеризованный cluster_b
В соответствии с порядком выполнения SQL мы сначала оцениваем операторы FROM
и JOIN
s, чтобы определить общий рабочий набор запрашиваемых данных, а затем оцениваем предложения WHERE
для фильтрации данных.
Итак, скажем, у меня есть этот запрос:
Запрос 1:
SELECT
id,
ta.date_a AS date,
ta.cluster_a,
tb.cluster_b
FROM table_a AS ta
LEFT JOIN table_b AS tb
USING (id)
WHERE
ta.date_a = '2022-11-01'
AND tb.date_b = '2022-11-01'
AND ta.cluster_a = 'a'
AND tb.cluster_b = 'b'
и этот другой, возвращающий тот же результат:
Запрос 2:
SELECT
id,
ta.date_a AS date,
ta.cluster_a,
tb.cluster_b
FROM (
SELECT
id,
date_a,
cluster_a
FROM table_a
WHERE
date_a = '2022-11-01'
AND cluster_a = 'a'
) AS ta
LEFT JOIN (
SELECT
id,
cluster_b
FROM table_b
WHERE
date_b = '2022-11-01'
AND cluster_b = 'b'
) AS tb
USING (id)
Учитывая эти два запроса:
FROM
и JOIN
перед присоединением? Или запрос 1 также фильтрует количество строк с предложением WHERE
перед выполнением соединения?В принципе, и это может быть применимо практически к любой базе данных:
Таким образом, query2 будет работать лучше, поскольку фильтры применяются до объединения, что приводит к меньшим наборам.
Да, прежде чем присоединиться к столу, вы должны применить как можно больше фильтров. Как правило, лучше присоединяться к небольшим столам, чем к большим. И да, большие столы должны быть слева.
Я как-то забыл проголосовать и отметить это как правильное, извините! Не могли бы вы подробнее рассказать о пункте номер 2? Вы имеете в виду, что большие таблицы должны быть сверху, а маленькие снизу? Например, если у меня есть таблица A (маленькая) и таблица B (большая), и я хочу получить несколько столбцов из B в A, естественным подходом будет
FROM A LEFT JOIN B
, но эффективнее лиFROM B RIGHT JOIN A
сначала разместить большую таблицу ?