数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

ORACLE大数据表Update处理


发布日期:2020年06月14日
 
ORACLE大数据表Update处理

ORACLE中如果表数据量很大(M级或更大)update某个字段是很慢的(如我的HIS项目中更新历史业务流程表万条记录用CURSOR来更新条COMMIT一次花了天也没更新完)后来尝试过的改进办法有

把表上的LOGGING取消

把表上的INDEX取消

但是依然很慢无奈下找到这个

在这个主题问答里ORA官方提了一种处理的办法

利用CREATE table as select xxxxx的办法来生成一新表T

在T上创建与目标表一样的索引

把目标表删除或RENAME(注意备份以备反悔)

把T改名成目标表

试了一下果然非常地快我的任务差不多在Min就完成了

如csywdktable_room是一张大表要删除其中bakfwid在noNewYWFW中的记录且要更新bakfwid在imp_table_room中记录的ROOM_LOC为imp_table_roomroom_loc:

()创建新表

create table tmp_new_table_room as

select tROOM_IDtNEWROOMIDtBUILDIDtTFHtDKHtBUILD_NOtLAYER_NOtROOM_NOtROOM_NAME

decode(tbakfwidnulltROOM_LOCtroom_loc)

tROOM_AREA

tSURTYPEtLAYER_NAMEtDEVDEPtCELLtDELFLAGtQXXZtSJSJLSHtFDtIDtBAKFWID

from csywdktable_room t left join imp_table_room t on tbakfwid=tbakfwid

where not exists(select from noNewYWFW t where tbakfwid=tbakfwid)

()创建备份表

create table Table_room as

select * from csywdktable_room

()替换原表

drop table sdetable_room

create table sdetable_room as

select * from tmp_new_table_room

在这个问答里还提到一句ORA PL/SQL效率相关的话

能用一句语句处理的任务决不要用多句编程来实现

原来老是怕一句执行时回滚段不够大看来只能准备好硬盘为上策了

上一篇:Oracle动态视图

下一篇:PL/SQL的几个概念区别