Объединение нескольких таблиц Presto с распределением соединения широковещательной рассылки - PullRequest
0 голосов
/ 18 июня 2020

У меня есть 3 таблицы:

A
 - id1
 - data
B 
 - id1
 - id2
 - data
C
 - id2
 - data
  • Таблица A очень мала, а таблица B и C потенциально огромны.

  • Таблица B имеет ключи соединения для обеих таблиц A и C. Итак, он должен присутствовать в первом соединении.

  • Из того, что я понимаю о соединениях в Presto, когда опции на основе затрат не включены, порядок выполнения соединений является порядком объявления объединений .
  • Кроме того, мы, очевидно, хотели бы иметь меньшую таблицу A в первой операции соединения, поскольку это уменьшит размер данных.
  • Итак, это означает, что первое соединение будет между таблицами A и B
  • Но, если я хочу выполнить распределенное соединение, тогда сторона сборки (правая сторона) соединения должна быть меньшей таблицей.
  • Итак, когда я перехожу к второе соединение между результатом AxB и C, правая часть соединения неизбежно оказывается таблицей большего размера.

Очень любопытно, как люди обычно справляются с таким сценарием в Presto. Если бы сторона сборки для распределенного соединения была левой стороной, то естественно, что мы всегда располагаем меньшие таблицы слева.

* 1027 уменьшение размера правой таблицы для распределенных объединений кажется противоречивым.

1 Ответ

1 голос
/ 18 июня 2020

Presto обычно выполняет соединение в объявленном порядке (когда оптимизация на основе затрат отключена), но пытается избегать перекрестных соединений , если это возможно. Если вы запустите EXPLAIN в своем запросе, вы сможете увидеть фактический порядок соединения для вашего запроса.

В приведенном выше примере вы можете избежать перекрестных соединений вручную, принудительно -ассоциативное соединение с круглыми скобками, аналогично тому, как работает arithmeti c (например, a - (b - c)):

WITH 
   a(x) AS (VALUES(1)), 
   b(x,y) AS (VALUES (1,'a')), 
   c(y) AS (VALUES 'a')
SELECT * 
FROM c JOIN (b JOIN a USING (x)) USING (y)
...