oracle专题-解决update效率慢问题

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秒钟执行成功。

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张先生程序猿

谢谢您的打赏,我会持续创作下去

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值