Heim >Datenbank >MySQL-Tutorial >如何提高Oracle大数据表Update效率

如何提高Oracle大数据表Update效率

WBOY
WBOYOriginal
2016-06-07 17:02:591305Durchsuche

ORACLE中如果表数据量很大(M级或更大),update某个字段是很慢的(如我的HIS项目中更新历史业务流程表,160万条记录,用CURSOR来

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

1.把表上的LOGGING取消

2.把表上的INDEX取消

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

?p=100:11:0::::P11_QUESTION_ID:6407993912330

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

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

2.在T1上创建与目标表一样的索引

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

4.把T1改名成目标表

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

如csywdk.table_room是一张大表,要删除其中bakfwid在noNewYWFW20081205中的记录,且要更新bakfwid在imp_table_room中记录的ROOM_LOC为imp_table_room.room_loc:

(1)创建新表

create table tmp_new_table_room081205 as

select t1.ROOM_ID,t1.NEWROOMID,t1.BUILDID,t1.TFH,t1.DKH,t1.BUILD_NO,t1.LAYER_NO,t1.ROOM_NO,t1.ROOM_NAME,

decode(t2.bakfwid,null,t1.ROOM_LOC,t2.room_loc)

t1.ROOM_AREA,

t1.SURTYPE,t1.LAYER_NAME,t1.DEVDEP,t1.CELL,t1.DELFLAG,t1.QXXZ,t1.SJSJLSH,t1.FD,t1.ID,t1.BAKFWID

from csywdk.table_room t1 left join imp_table_room t2 on t1.bakfwid=t2.bakfwid

where not exists(select 1 from noNewYWFW20081205 t3 where t3.bakfwid=t1.bakfwid)

(2)创建备份表

create table Table_room081205 as

select * from csywdk.table_room

(3)替换原表

drop table sde.table_room

create table sde.table_room as

select * from tmp_new_table_room081205

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

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

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

linux

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn