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 ?

解决方法

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

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

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...