关于一对多关系的最佳有效SQL更新

时间:2014-12-28 16:22:12

标签: sql db2

我有一对多关系表

(一)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数据库。

2 个答案:

答案 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]

请参阅:

http://www-01.ibm.com/support/knowledgecenter/SSEPGG_10.5.0/com.ibm.db2.luw.admin.dm.doc/doc/t0004554.html

和:

http://www-01.ibm.com/support/knowledgecenter/SSEPGG_10.5.0/com.ibm.db2.luw.admin.dm.doc/doc/c0004587.html

答案 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;

在删除所有内容之前,请先验证数据。