DB2 - 在两个大文件之间找到相同的记录

DB2 - find same rec between 2 big files

我有 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 小时了。

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

提前致谢

丹尼斯

我会推荐 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 ...

快速写法是

SELECT * FROM TABLE_A
INTERSECT
SELECT * FROM TABLE_B

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

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