Presto sql join против пересечения-союза, который более эффективен

постановка задачи:-

имя_процесса - test.exe, ключ_ реестра - \ REGISTRY \ test, ip - 192.xxx

схема:-

      process_name is in process table
registry_key is in registry table
ip is in network table
process_id is common across all tables

размер каждой таблицы составляет около 500 ГБ, данные в формате s3 в формате orc. Я запрашиваю данные, создавая внешнюю таблицу hive и используя presto в качестве механизма обработки.

Я могу решить вышеуказанную проблему, следуя подходам

  1. с использованием объединения-пересечения
       SELECT process_id
FROM   process_table
WHERE  process_name = 'test.exe'
INTERSECT
SELECT process_id
FROM   registry_table
WHERE  registry_key = '\\REGISTRY\\test'
INTERSECT
SELECT process_id
FROM   network_table
WHERE  ip = '192.x.x.x'
  1. используя соединение
       SELECT process_table.process_id
FROM   process_table
       INNER JOIN registry_table
               ON process_table.process_id = registry_table.process_id
       INNER JOIN network_table
               ON process_table.process_id = network_table.process_id
WHERE  process_name = 'test.exe'
       AND registry_key = '\\REGISTRY\\test'
       AND ip = '192.x.x.x'

Оба дают одинаковые результаты. Я хочу знать, какой из них более эффективен, объединение или объединение пересечений?

1 ответ

Вопрос по эффективности не актуален.

В вашем конкретном случае INTERSECT и INNER JOIN могут возвращать один и тот же набор данных, но в целом эти два совершенно разные:

  • INNER JOIN не вернет строки с NULL в ключах соединения, INTERSECT вернет NULL.
  • INNER JOIN будет создавать дублированные строки, если дублируется ключ соединения, в результате у вас может быть больше строк, чем было в самой большой таблице.
  • INTERSECT удалит полные дубликаты, и в результате у вас может быть меньше строк, чем в самой маленькой таблице.
Другие вопросы по тегам