ASKTOM 关于更新上百万的数据方法

假设如果我要更新数百万以上的数据, 我大概会选择不去’更新’ (UPDATE)吧.

我很有可能会用以下的方法:

CREATE TABLE new_table as select <在此更新> from old_table;
index new_table (给新的表创建索引)
grant on new table (授权于新的表)
add constraints on new_table (给新的表加上约束)
etc on new_table (加上其它所须的东西在新表)
drop table old_table (删除旧的表)
rename new_table to old_table; (给新的表重新命名为旧的表名)

在大多数的操作上, 你可以使用并行查询(PARALLEL QUERY)并加上NOLOGGING的语句来产生非常少重做日志(REDO LOG) 及 UNDO LOG  . 这样的做法可以在很短的时间就可以更新数据了.

这绝对是可施行的方法, 而且也是我们一直在不断重复使用的方法. 我们其中的一个应用程式便用于这方法来更新含有数亿数据的表.

经我们的计算CURSOR … FOR LOOP 的方式将会需要53.7年来完成数据的更新. 我们采用INSERT INTO DUMMY TABLE的方式并加上NOLOGGING的语句的结果使我们在在30分以内就完成了数据更新.

在用NOLOGGING的语句, 假若系统中断, 只要再重新执行更新(UPDATE)就可以了.因为所有的数据还在原来的表. 当结束时(INSERT), 只要把表DUMMY(含有以更新的数据)跟原来的表中的分区(PARTITION)交换就可以了(译着注: 用exchange partition的语句).

更新表中FIELD2
(1) 首先, 创建表DUMMY,
        create table xyz_HOLD as select * from xyz where rownum<1
        Alter tablexyz nologging

(2) )   insert /*+ append parallel (xyzhold,12) */
        into xyz_hold xyzhold (field1, field2, field3)
        select /*+ parallel (x,12) */ xyz.field1, my_new_value_for_field2, xyz.field3
        from xyz x
        where <等等..>

(3) 当结束时, 可以给表重新命名 (RENAME)或是如果原来的表如是分区(PARTITION)的话, 与分区交换数据; 或更新所需要的分区就好了. 当然你必须重创索引(REBUILD INDECIES), 及其它所需的.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值