我有一对多关系表
(一)table_one.OLD_ID ==> (许多)table_two.OLD_ID:
table_one:
OLD_ID SOME_DATA NEW_ID(ID)
"aaaaaa" "dataA" 123
"bbbbbb" "dataB" 124
table_two:
OLD_ID res_id(ID) SOME_DATA TABLE_ONE_NEW_ID
"bbbbbb" 1 "DATA_Z" NULL
"aaaaaa" 2 "DATA_G" NULL
"aaaaaa" 3 "DATA_J" NULL
"aaaaaa" 4 "DATA_H" NULL
"bbbbbb" 5 "DATA_J" NULL
现在我有来自table_two的近1,000,000条记录 来自table_one的近240,000条记录。
我试图找到的是用table_one.NEW_ID更新table_two_TABLE_ONE_NEW_ID的最快方法OLD_ID
此查询花费了太多时间:
UPDATE table_two
set TABLE_ONE_NEW_ID = (select NEW_ID from table_one
where table_one.OLD_ID = table_two.OLD_ID)
我有索引:
table_two.OLD_ID,table_one.OLD_ID,table_one.NEW_ID
我正在使用DB2数据库。
答案 0 :(得分:3)
我在这里假设LUW,我还假设table_one(OLD_ID)上有一个唯一索引。除非已经如此,否则您可以考虑在此索引中包含new_id,即
create unique index ... on table_one (old_id) include (new_id) ...
使用merge语句执行此操作可能最简单:
merge into table_two x
using (
select old_id, new_id from table_one
) y
on x.old_id = y.old_id
when matched then update
set x.TABLE_ONE_NEW_ID = y.new_id
对于您所指的大小的表,这可能需要相当多的资源。导出应该进入表的数据,然后用表中的内容替换表中的内容可能更快:
export to myfile.ixf of ixf
select x.old, x.res_id, x.some_data, y.new_id
from table_two x
left join table_one y
on x.old_id = y.old_id;
load from myfile.ixf of ixf replace into table_two [recoverable options]
请参阅:
和:
答案 1 :(得分:1)
如果索引没有帮助,您可能会发现重新创建表比执行更新要快。毕竟更新表中的所有行是很多工作。
create table tmp_table2 like table_two;
insert into tmp_table2(OLD_ID, res_id, SOME_DATA, TABLE_ONE_NEW_ID)
select t2.OLD_ID, t2.res_id, t2.SOME_DATA, t1.new_id
from table_two t2 left join
table_one t1
on t2.old_id = t1.old_id;
此查询最适合table_one(old_id)
上的索引。
如果成功并按照您的意愿行事,请执行以下操作:
truncate table table_two;
insert into table_two
select *
from tmp_table2;
在删除所有内容之前,请先验证数据。