Oracle表字段数据更新(大数据量)

zhyz_1209 2021-02-02 04:35:35
在项目中遇到以下情况:

有A,B两张表,每张表中都有400多万条数据,A表的主键为ID,B表中的RESULT_ID对应了A表的主键,A表有一个字段field,现在需要将A表中的field字段的值更新到B表中的对应字段中,现执行如下语句发现执行3个小时仍无法执行完毕,
update A a set a.field = (select b.field from B b where a.id = b.RESULT_ID)

是否有更高效的操作方法,请大佬指导

...全文
924 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhyz_1209 2022-02-08
  • 打赏
  • 举报
回复

十分感谢大家的回复,记得当时是使用的CTAS方法完成的。

weixin_49696038 2021-07-02
  • 打赏
  • 举报
回复

merge into tab_b b
using tab_a a
on (b.result_id = a.id)
when matched then
update
set b.field = a.field;
同时b.result_id = a.id两个列加索引

=PNZ=BeijingL 2021-05-11
  • 打赏
  • 举报
回复
一次commit 会占用较多的回滚段和系统资源,所以性能会慢,游标查询分批提交更新会快一些

也可以CTAS 查询A表和B表, 创建1个临时表C, 然后重命名B表为B1,将临时表修改成B,但是对新B表 重新创建索引,约束等表定义
  • 打赏
  • 举报
回复
loop分批更新才是合理的。
miqi_oracle 2021-05-07
  • 打赏
  • 举报
回复
直接CTAS,不走update
冰思雨 2021-04-12
  • 打赏
  • 举报
回复
给 B 表的 RESULT_ID 建一个索引试试。没有索引的话是全表扫描B表,当然会慢了。
卖水果的net 2021-02-03
  • 打赏
  • 举报
回复
分批更新,每次 10000 行。
liu志坚 2021-02-03
  • 打赏
  • 举报
回复
参考1楼分批,写错了。
liu志坚 2021-02-03
  • 打赏
  • 举报
回复
参考2楼的写个语句块分批更新。 where a.id = b.RESULT_ID 这两个表的连接列建上索引,让执行计划走B表的索引。
微风轻轻 起 2021-02-03
  • 打赏
  • 举报
回复
update A a set a.field = b.field where exists (select 1 from B b where a.id = b.RESULT_ID)

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧