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 或(可能)可变长度字符串,连接将失败)更好更正确
我有 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 或(可能)可变长度字符串,连接将失败)更好更正确