sql - Presto sql join 与 intersect-union 哪个性能效率更高
问题描述
问题陈述:
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 将删除完整的重复项,因此您的行数可以少于最小表中的行数。
推荐阅读
- python - Collatz 猜想程序在高位数时随机停止准确
- java - Spring boot:创建名称为“methodValidationPostProcessor”的bean时出错
- reactjs - 当前未启用对实验性语法“decorators-legacy”的支持
- android-8.1-oreo - CaptivePortal 无法在自定义 Android Oreo 系统中运行
- c# - Azure 逻辑应用。根据电子邮件附件名称写入不同的 blob 容器
- ios - 运行我的应用程序时出现此错误。线程 1:致命错误:在展开可选值时意外发现 nil
- angular - 在 Angular 中,对于 Html 和 TS 上的每个错误和模块错误,它显示相同的错误详细信息
- java - Java框架图标化问题
- ssis - SSIS从多个文件中获取特定文件并复制到不同的文件夹
- docker - Docker 内部使用来自用户 IP 地址池的 IP 地址