1、背景需求
update大表的时候执行效率很低,那么怎样才能让Oracle中update数据量比较大的表执行的更快呢?
2、模拟场景
要将表table1中的LANT_ID更新成table2表中的LATN_ID,关联条件是table1.TB2_ID=table2.ID,目标表中table1的数据量大概10W,源表table2数据量大概100多万,更新语句如下:
UPDATE table1 T1
SET T1.LANT_ID =
(SELECT T2.LATN_ID
FROM table2 T2
WHERE T2.ID = T1.TB2_ID)
WHERE EXISTS
(SELECT 1 FROM table2 WHERE ID = T1.TB2_ID);
程序执行大概半个多小时,更新成功;数据量不是很大,如果数据量更大的话应该不能接受,
于是会有一部分人想到在table2表的TB2_ID上创建索引,table1表的ID字段是表的主键字段,于是我们创建一下table2表的索引:
CREATE INDEX IDX_table1_TB2_ID ON table1(TB2_ID)
tablespace TBS_TMPS_IDX;
3、解决问题
3.1. merge into语法
用merge into tableA using (括号里面是你需要的字段,来自于其它表的数据 比如 tableB) on(tableA 跟tableB 的关联条件)
when matched then update set tableA.id=tableB.id ;
3.2. 改写上面需求的更新语句。
MERGE INTO table1 T1
USING table2 T2
ON (T1.TB2_ID = T2.ID)
WHEN MATCHED THEN
UPDATE SET T1.LATN_ID = T2.LATN_ID;
6秒钟执行成功。