如何更快不停机更新全表

大饼Ora 2016-06-24 02:26:31
因为导入历史数据,大约4. 5KW 条。需要更新其中两个字段。
但是这张表 一直有实时数据进来,不能停机。

有什么更好的方法。

之前是是根据id进行for循环。更新2W条竟然要7个小时。。。
...全文
224 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
大饼Ora 2016-06-25
  • 打赏
  • 举报
回复
上面 条件 写错位置了
大饼Ora 2016-06-25
  • 打赏
  • 举报
回复
引用 11 楼 wmxcn2000 的回复:
你的语句怎么写的?发上来

for rec in (select s.pnt_id
                from table_1 s
               and rownum<=1000
               where s.flag = 0
               order by s.pnt_id ) loop
   
    update table_2 h
       set h.sync_flag = 1, 
              h.status = 1
     where h.hpt_id = rec.pnt_id;
 
end loop;
是这样吗
大饼Ora 2016-06-25
  • 打赏
  • 举报
回复
引用 11 楼 wmxcn2000 的回复:
你的语句怎么写的?发上来

for rec in (select s.pnt_id
                from table_1 s
               where s.flag = 0) loop
  
    update table_2 h
       set h.sync_flag = 1, 
              h.status = 1
     where h.hpt_id = rec.pnt_id;

end loop;

一次1000条怎么写
卖水果的net 2016-06-25
  • 打赏
  • 举报
回复
引用 10 楼 q12344566789 的回复:
[quote=引用 6 楼 wmxcn2000 的回复:] 就是我借了你100 块,我还你的时候,分 100 次还你,你是不是觉得不爽?
感觉还是很慢 1000条commit[/quote] 不是 1000 条提交一次,是一次更新 1000 条;
卖水果的net 2016-06-25
  • 打赏
  • 举报
回复

-- 大概这个样子;
begin
    loop 
        update t2 set col1 = 1 , col2 = 2 
        where exists(select* from t1 where t1.id =t2.id) 
        and rownum< =1000;
        commit ;
        exit when row%count <= 0 ;
    end loop ; 
end ; 
/    
califord 2016-06-24
  • 打赏
  • 举报
回复
不知道楼主具体是怎么更新的 可以考虑做一下分区以及索引,这样更新比较快
卖水果的net 2016-06-24
  • 打赏
  • 举报
回复
你的语句怎么写的?发上来
大饼Ora 2016-06-24
  • 打赏
  • 举报
回复
引用 6 楼 wmxcn2000 的回复:
就是我借了你100 块,我还你的时候,分 100 次还你,你是不是觉得不爽?
感觉还是很慢 1000条commit
大饼Ora 2016-06-24
  • 打赏
  • 举报
回复
引用 8 楼 ghx287524027 的回复:
另外,更新的条数不是越多越好,如果超过缓存大小的话,就会出错。
1000条的话,应该可以吧
ghx287524027 2016-06-24
  • 打赏
  • 举报
回复
引用 7 楼 q12344566789 的回复:
[quote=引用 6 楼 wmxcn2000 的回复:] 就是我借了你100 块,我还你的时候,分 100 次还你,你是不是觉得不爽?
[/quote] 另外,更新的条数不是越多越好,如果超过缓存大小的话,就会出错。
大饼Ora 2016-06-24
  • 打赏
  • 举报
回复
引用 6 楼 wmxcn2000 的回复:
就是我借了你100 块,我还你的时候,分 100 次还你,你是不是觉得不爽?
卖水果的net 2016-06-24
  • 打赏
  • 举报
回复
引用 4 楼 q12344566789 的回复:
[quote=引用 3 楼 wmxcn2000 的回复:] 分批更新,一次更新 500 条,或 1000 条,更新一次,提交一次;
恩。更新一条commit和1000条commit有啥区别吗?[/quote] 就是我借了你100 块,我还你的时候,分 100 次还你,你是不是觉得不爽?
大饼Ora 2016-06-24
  • 打赏
  • 举报
回复
引用 2 楼 ghx287524027 的回复:
历史数据怎么导入的,insert吗?可以研究一下 merge into 是不是满足你需求
数据已经导入进去了。需要处理一下。更新两个字段的值
大饼Ora 2016-06-24
  • 打赏
  • 举报
回复
引用 3 楼 wmxcn2000 的回复:
分批更新,一次更新 500 条,或 1000 条,更新一次,提交一次;
恩。更新一条commit和1000条commit有啥区别吗?
卖水果的net 2016-06-24
  • 打赏
  • 举报
回复
分批更新,一次更新 500 条,或 1000 条,更新一次,提交一次;
ghx287524027 2016-06-24
  • 打赏
  • 举报
回复
历史数据怎么导入的,insert吗?可以研究一下 merge into 是不是满足你需求
大饼Ora 2016-06-24
  • 打赏
  • 举报
回复
@卖水果的net @小灰狼W 大神快来

17,086

社区成员

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

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