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

<p>假设如果我要更新数百万以上的数据, 我大概会选择不去’更新’ (UPDATE)吧.<br><br>
我很有可能会用以下的方法:<br><br>
CREATE TABLE new_table as select <在此更新> from old_table;<br>
index new_table (给新的表创建索引)<br>
grant on new table (授权于新的表)<br>
add constraints on new_table (给新的表加上约束)<br>
etc on new_table (加上其它所须的东西在新表)<br>
drop table old_table (删除旧的表)<br>
rename new_table to old_table; (给新的表重新命名为旧的表名)<br><br>
在大多数的操作上, 你可以使用并行查询(PARALLEL QUERY)并加上NOLOGGING的语句来产生非常少重做日志(REDO LOG) 及 UNDO LOG . 这样的做法可以在很短的时间就可以更新数据了.</p>
<p>这绝对是可施行的方法, 而且也是我们一直在不断重复使用的方法. 我们其中的一个应用程式便用于这方法来更新含有数亿数据的表.<br><br>
经我们的计算CURSOR … FOR LOOP 的方式将会需要53.7年来完成数据的更新. 我们采用INSERT INTO DUMMY TABLE的方式并加上NOLOGGING的语句的结果使我们在在30分以内就完成了数据更新.<br><br>
在用NOLOGGING的语句, 假若系统中断, 只要再重新执行更新(UPDATE)就可以了.因为所有的数据还在原来的表.
当结束时(INSERT), 只要把表DUMMY(含有以更新的数据)跟原来的表中的分区(PARTITION)交换就可以了(译着注:
用exchange partition的语句). <br><br>
更新表中FIELD2<br>
(1) 首先, 创建表DUMMY, <br>
create table xyz_HOLD as select * from xyz where rownum<1<br>
Alter tablexyz nologging<br><br>
(2) ) insert /*+ append parallel (xyzhold,12) */ <br>
into xyz_hold xyzhold (field1, field2, field3) <br>
select /*+ parallel (x,12) */ xyz.field1, my_new_value_for_field2, xyz.field3 <br>
from xyz x <br>
where <等等..><br><br>
(3) 当结束时, 可以给表重新命名 (RENAME)或是如果原来的表如是分区(PARTITION)的话, 与分区交换数据; 或更新所需要的分区就好了. 当然你必须重创索引(REBUILD INDECIES), 及其它所需的.</p>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值