熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

ORACLE大數據表Update處理

2013-11-13 22:23:41  來源: Oracle 

  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
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.