首页 > 解决方案 > 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作为处理引擎来查询数据。

我可以通过以下方法解决上述问题

  1. 使用联合交集

    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'
    
  2. 使用连接

    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 ?

标签: sqljoinprestotrino

解决方案


关于效率的问题无关紧要。

如果您的特殊情况 INTERSECT 和 INNER JOIN 可以返回相同的数据集,但通常这两个是完全不同的:

  • INNER JOIN 不会返回连接键中包含 NULL 的行,INTERSECT 将返回 NULL。
  • 如果连接键重复,INNER JOIN 将产生重复的行,因此您可以拥有比最大表中更多的行。
  • INTERSECT 将删除完整的重复项,因此您的行数可以少于最小表中的行数。

推荐阅读