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 哪个性能效率更高的主要内容,如果未能解决你的问题,请参考以下文章

Presto 中支持的七种 Join 类型

presto,dremio,spark-sql与ranger的整合记录

Presto与Hive SQL对比

Presto与Hive SQL对比

Spark SQL 与 Presto SQL 对比

Spark SQL 与 Presto SQL 对比