问题描述
问题说明:
process_name
是“test.exe”,registry_key 是 \\REGISTRY\\test
,ip 是 192.x.x.x
。
架构:
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 GB,数据为 orc 格式的 s3。我通过创建 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'
两者都返回相同的结果;我想知道哪个更有效 - join 还是 intersect-union ?
解决方法
关于效率的问题无关紧要。
在您的特殊情况下,INTERSECT 和 INNER JOIN 可以返回相同的数据集,但通常这两者完全不同:
- INNER JOIN 不会返回连接键中为 NULL 的行,INTERSECT 将返回 NULL。
- 如果连接键重复,INNER JOIN 将产生重复的行,因此您可以拥有比最大表中更多的行。
- INTERSECT 将删除完整的重复项,因此您的行数可以少于最小表中的行数。