【问题标题】:DB2 - find same rec between 2 big filesDB2 - 在 2 个大文件之间找到相同的记录
【发布时间】:2020-12-23 15:27:33
【问题描述】:

我有 2 个结构相同的文件(20 个字段) 我必须找出是否存在相等的记录。 问题是这个文件有超过 4000 万条记录。

所以我开始了一个 SELECT 像:

SELECT * FROM TABLE_A
  WHERE FIELD1||FIELD2||FIELD3||FIELD4...etc
  IN (SELECT FIELD1||FIELD2||FIELD3||FIELD4...etc
        FROM TABLE_B) 

我在 24 小时前就开始了。

谁能告诉我是否有更快速的解决方案,我该如何改进它?

提前谢谢大家

丹尼斯

【问题讨论】:

    标签: sql db2 subquery where-clause


    【解决方案1】:

    我会推荐exists

    select *
    from table_a a
    where exists (
        select 1
        from table_b b
        where b.field1 = a.field1 and b.field2 = a.field2 and ...
    );
    

    好处是:

    • 正确性:这会检查是否完全匹配,而连接字符串的方法可能会产生假阳性(更不用说如果某些列不是字符串的转换问题)

    • 性能:子查询的from子句中的表达式是SARGable;如果您要在这 40 列中的至少一个子集上创建索引,那么数据库可能会在执行查询时利用它

    注意:这不能正确处理null 值;如果您想将null 值视为相等,那么您需要更复杂的表达式:

    where 
        (b.field1 = a.field1 or (b.field1 is null and a.field1 is null))
        and (b.field2 = a.field2 or (b.field2 is null and a.field2 is null))
        and ...
    

    【讨论】:

    • 太棒了!!!我喜欢。我明天试试 :-) 非常感谢。
    • 仅供参考,您可以使用 IS NOT DISTINCT FROM 来避免需要显式检查 NULL。见ibm.com/support/knowledgecenter/SSEPGG_11.5.0/…
    • 谢谢大家 :-) 我不能给出“有用的”,因为我还没有必要的声誉。
    【解决方案2】:

    快速写法是

    SELECT * FROM TABLE_A
    INTERSECT
    SELECT * FROM TABLE_B
    

    但在性能方面可以有更好的方法,即使它们的代码可能更复杂。

    不过,它比连接列更好、更正确(如果你有 NULL 或(可能)可变长度字符串,这将失败)

    【讨论】:

      猜你喜欢
      • 2021-11-27
      • 1970-01-01
      • 2010-12-04
      • 1970-01-01
      • 1970-01-01
      • 2019-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多