В BigQuery SQL, каков наиболее эффективный способ объединения и фильтрации второй таблицы? - PullRequest
0 голосов
/ 20 сентября 2018

В BigQuery, какой самый эффективный способ (с точки зрения производительности) выполнить следующую задачу?

Цель: выбрать из таблицы table_a строки, которые совпадают со строками из США в table_b.

Я вижу по крайней мере три различных способа решения этой задачи.

1) Использование подзапроса для фильтрации

SELECT * FROM table_a
JOIN (select * from table_b where country='US') table_b
ON table_a.userid = table_b.userid

2) Использование предложений объединения для фильтрации

SELECT * FROM table_a
JOIN table_b
ON table_a.userid = table_b.userid
  AND table_b.country='US'

3) Добавление предложения where в конце

SELECT * FROM table_a
JOIN table_b
ON table_a.userid = table_b.userid 
WHERE table_b.country='US'

Ответы [ 3 ]

0 голосов
/ 20 сентября 2018

Если вы используете стандартный SQL для этих запросов, то все они будут выполняться одинаково, что вы можете подтвердить, посмотрев объяснение плана запроса после их выполнения.В частности, BigQuery применяет следующие преобразования:

  • BigQuery пропускает фильтры через INNER JOIN с, поэтому помещение WHERE в подзапрос перед объединением аналогично его появлению вне объединения.
  • BigQuery извлекает некоррелированные фильтры из предложения ON, поэтому ON table_b.country='US' обрабатывается так же, как WHERE table_b.country='US'.

Если вы вместо этого используете устаревший SQL, тогда вам нужнопереместить условие внутри подзапроса до объединения, поскольку BigQuery не «проталкивает» фильтры через объединения при использовании устаревшего SQL.

0 голосов
/ 20 сентября 2018

Запрос с подзапросом будет самым медленным, затем 3-й и наиболее оптимизированный - 2-м, поскольку он использует только соединение, тогда как в 3-м запросе используются как соединение, так и предложение WHERE.

Выможет обратиться к этим сообщениям stackoverflow, чтобы получить более глубокое понимание.Разница между объединениями и подзапросом: Соединение и подзапрос Разница между объединениями и предложением where: Является ли JOIN быстрее, чем WHERE?

Надеюсь, это поможет!

0 голосов
/ 20 сентября 2018

В вашем случае - я бы пошел ниже, чтобы сузить объем JOIN как можно раньше.Несмотря на то, что BigQuery Engine достаточно умен, чтобы разработать эту оптимизацию самостоятельно, независимо от того, какую версию (из трех рассматриваемых запросов) вы используете

SELECT * 
FROM table_a 
JOIN (SELECT * FROM table_b WHERE country='US') table_b 
ON table_a.userid = table_b.userid  

, но если вам нужны только строки из table_a- Я бы пошел с чем-то вроде

SELECT a.* 
FROM table_a a
JOIN (SELECT DISTINCT userid FROM table_b WHERE country='US') table_b 
ON a.userid = table_b.userid  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...