海量資料處理_批量插入

redhouser發表於2011-05-31

大量資料插入效能優化:
1,通過使用如下選項,可能大幅度提高效能:
更改表屬性:
drop index
disable trigger
disable constraint
alter table t nologging(關於日誌,參考附錄)

處理過程:
append
parallel
batch commit

2.對於同一資料庫,並行查詢、插入:
alter session enable parallel dml;
insert /*+parallel(t1 8) */ into tab1 t1
select /*+parallel(t2 8) */ * from tab2 t2;
commit;
alter session disable parallel dml;

3.對於不同資料庫,可選方案如下:
3.1可移動表空間,速度最快
3.2使用外部表,因為匯出過程可以並行,無須匯入,速度很快(參考海量資料處理_使用外部表進行資料遷移)
3.3資料泵匯出、匯入,因為匯入、匯出過程都可以使用並行,速度很快
3.4通過database link複製,查詢和插入都可以並行,瓶頸在網路傳輸
3.5sqlplus copy,支援如下型別:CHAR,DATE,LONG,NUMBER,VARCHAR2
測試:
drop table t;

create table t
as
select cust_id,name_zh,name_en,mksg_id from customer where 1=2;

set copycommit 2;
set arraysize 5000;
copy from bocnet/bocnet@it30_22.188.20.97 -
insert t -
using SELECT cust_id,name_zh,name_en,mksg_id from customer;


附錄:
引用一下前人的結論:
(1)資料庫在歸檔模式下
  當表模式為logging狀態時,無論是append模式還是no append模式,redo都會生成。
  當表模式為nologging狀態時,只有append模式,不會生成redo.

(2)資料庫在非歸檔模式下
 無論是在logging還是nologing的模式下,append的模式都不會生成redo,而noappend模式下都會生成redo。

(3)在Oracle內部還存在一個內部引數:_disable_logging 預設是false
 通過更改為true可以讓Oracle在修改表中的記錄的時候完全不記錄redo,這個引數要慎用。平時,我們只作為效能測試用。

(4)force logging(強制日誌)模式:
 alter database force logging來使得Oracle無論什麼操作都進行redo的寫入。
 通過select force_logging from v$database可以看到當前資料庫強制日誌模式的狀態。


 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/18922393/viewspace-696795/,如需轉載,請註明出處,否則將追究法律責任。

相關文章