Presto sql join 与 intersect-union 哪个性能效率更高
Posted
技术标签:
【中文标题】Presto sql join 与 intersect-union 哪个性能效率更高【英文标题】:Presto sql join vs intersect-union which one is more performance efficient 【发布时间】:2021-05-10 11:01:46 【问题描述】:问题陈述:
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 ?
【问题讨论】:
【参考方案1】:关于效率的问题无关紧要。
如果您的特殊情况 INTERSECT 和 INNER JOIN 可以返回相同的数据集,但通常这两个是完全不同的:
INNER JOIN 不会返回连接键中包含 NULL 的行,INTERSECT 将返回 NULL。 如果连接键重复,INNER JOIN 将产生重复的行,因此您可以拥有比最大表中更多的行。 INTERSECT 将删除完整的重复项,因此您的行数可以少于最小表中的行数。【讨论】:
对于上述给定的情况,哪种方法执行得更快,你能说出来吗? @AbhiK 。 . .你错过了这个答案的重点。两者的结果是不同的。您应该使用语义上您想要的版本。您的问题不足以说结果是相同的。 @AbhiK 检查 EXPLAIN 命令并测量执行时间。如果您没有重复项,我打赌 INNER JOIN,因为它不关心不同的并且仅通过有限数量的键加入 @AbhiK 如果出现重复,INNER JOIN 可能会运行得更慢,因为重复会显着增加行数 @AbhiK 这个问题就像什么更有效:提交还是回滚...以上是关于Presto sql join 与 intersect-union 哪个性能效率更高的主要内容,如果未能解决你的问题,请参考以下文章