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效率相關的話
能用一句語句處理的任務決不要用多句編程來實現
原來老是怕一句執行時回滾段不夠大看來只能准備好硬盤為上策了
From:http://tw.wingwit.com/Article/program/Oracle/201311/18980.html