美文网首页
Oracle千万级数据更新

Oracle千万级数据更新

作者: 忧从中来 | 来源:发表于2019-06-14 22:44 被阅读0次

    需求

    有t1,t2两张表,通过A字段关联,现在需要在t1表新增字段B,将t2表中的字段C更新到t1表新增的字段B中。t1表数据一千二百万,t2表数据七百万。

    常规方法

    直接使用update来更新字段。

      --t1表新增字段B
      alter table t1 add ( B varchar2(32));
      --将t2表的字段C更新到t1表的B列中
      update t1 set B = (select C from t2 where t1.A =  t2.A);
    

    在数据量较少的时候,这种写法其实是没问题的,简洁易懂。但是数据量太大的情况则不适用,在测试环境实际跑了一下,一个小时都没更新完,遂放弃。

    使用MERGE

    merge into是oracle内置函数,通常用来处理insertOrUpdate的需求,如果存在数据就update,如果不存在就insert。也可以只用来更新,速度很快。

       --t1表新增字段B
        alter table t1 add ( B varchar2(32));
        --通过merger的方式,将B表的column3字段更新到A表的column2列中
        merge into t1 Using (select * from t1 ) on (t1.A = t2.A)
        when matched then update set t1.B = t2.C
    

    通过这种方式,在测试环境实际跑下来十分钟左右可以更新完成。
    merge into的详细用法可以参考这篇文章:
    Oracle中merge into的使用

    使用CTAS

    create table as 的方式在之前的使用中,多用于创建备份表。因为这次需求才认识到其更多的用法。性能十分强悍。

        --首先使用ctas的方式创建临时表
        create table temp_A as select t1.*,t2.C from t1 left join t2 on t1.A = t2.A;
        --删除原始表
        drop table A;
        --将临时表重名称
         rename temp_A to A;
        --重新创建原表的索引等。。。
        create index ......
    

    测试环境执行下来,一分钟左右可以执行完成。
    CTAS的更多用法,可以参考Oracle官网的如下内容:
    How to Update millions or records in a table
    这一段内容信息量非常大,值得仔细品读。

    相关文章

      网友评论

          本文标题:Oracle千万级数据更新

          本文链接:https://www.haomeiwen.com/subject/icpmfctx.html