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 в качестве механизма обработки.
Я могу решить вышеуказанную проблему, следуя подходам
- с использованием объединения-пересечения
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'
- используя соединение
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 удалит полные дубликаты, и в результате у вас может быть меньше строк, чем в самой маленькой таблице.