Порядок выполнения BigQuery при присоединении

Я хочу понять логику выполнения и извлечения данных в BigQuery, чтобы писать более эффективные запросы. Представьте, что у меня есть следующие таблицы, каждая из которых содержит большое количество строк:

  • table_a: ключ соединения id, разделенный date_a и кластеризованный cluster_a
  • table_b: ключ соединения id, разделенный date_b и кластеризованный cluster_b

В соответствии с порядком выполнения SQL мы сначала оцениваем операторы FROM и JOINs, чтобы определить общий рабочий набор запрашиваемых данных, а затем оцениваем предложения 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)

Учитывая эти два запроса:

  • Является ли запрос 2 более эффективным, поскольку я фильтрую предложения FROM и JOIN перед присоединением? Или запрос 1 также фильтрует количество строк с предложением WHERE перед выполнением соединения?
  • Есть ли другой способ улучшить этот запрос?
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
0
385
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В принципе, и это может быть применимо практически к любой базе данных:

  1. лучше иметь меньшие таблицы перед объединением
  2. Пусть большая таблица соединяется с маленькой, а не большая таблица с большой.
  3. Избегайте ненужных столбцов в предложении SELECT.

Таким образом, query2 будет работать лучше, поскольку фильтры применяются до объединения, что приводит к меньшим наборам.

Я как-то забыл проголосовать и отметить это как правильное, извините! Не могли бы вы подробнее рассказать о пункте номер 2? Вы имеете в виду, что большие таблицы должны быть сверху, а маленькие снизу? Например, если у меня есть таблица A (маленькая) и таблица B (большая), и я хочу получить несколько столбцов из B в A, естественным подходом будет FROM A LEFT JOIN B, но эффективнее ли FROM B RIGHT JOIN A сначала разместить большую таблицу ?

Luiscri 28.03.2023 14:48

Да, прежде чем присоединиться к столу, вы должны применить как можно больше фильтров. Как правило, лучше присоединяться к небольшим столам, чем к большим. И да, большие столы должны быть слева.

David Morales 30.03.2023 09:45

Другие вопросы по теме