insert 性能

1.
insert into tab1 select * from tab2;

commit;
這是最基礎的insert語句,我們把tab2表中的數據insert到tab1表中。根據經驗,千萬級的數據可在1小時內完成。但是該方法產生的arch會非常快,需要關注歸檔的產生量,及時啓動備份軟件,避免arch目錄撐爆。
2.
insert /*+ append */ into tab1nologging select * from tab2;

commit;
該方法會使得產生arch大大減少,並且在一定程度上提高時間,根據經驗,千萬級的數據可在45分鐘內完成。但是請注意,該方法適合單進程的串
行方式,如果當有多個進程同時運行時,後發起的進程會有enqueue的等待。
3.
insert into tab1 select /*+ parallel */ * from tab2;

commit;
對於select之後的語句是全表掃描的情況,我們可以加parallel的hint來提高其併發,這裏需要注意的是最大併發度受到初始化參數parallel_max_servers的限制,併發的進程可以通過v$px_session查看,或者ps -ef |grep ora_p查看。

4.

alter session enable parallel dml;

insert /*+ parallel */ into tab1 select * from tab2;

commit;
與方法2相反,併發的insert。

5.
insert into tab1 select * from tab2 partition (p1);

insert into tab1 select * from tab2 partition (p2);

insert into tab1 select * from tab2 partition (p3);

insert into tab1 select * from tab2 partition (p4);
對於分區表可以利用tab1進行多個進程的併發insert,分區越多,可以啓動的進程越多。。

6.
DECLARE

TYPE dtarray IS TABLE OF VARCHAR2(20) INDEX BY BINARY_INTEGER;

v_col1 dtarray;

v_col2 dtarray;

v_col3 dtarray;

BEGIN

SELECT col1, col2, col3 BULK COLLECT

INTO v_col1, v_col2, v_col3

FROM tab2;

FORALL i IN 1 .. v_col1.COUNT

insert into tab1 WHERE tab1.col1 = v_col1;

END;
用批量綁定(bulk binding)的方式。當循環執行一個綁定變量的sql語句時候,在PL/SQL 和SQL引擎(engines)中,會發生大量的上下文切換(context switches)。使用bulk binding,能將數據批量的從plsql引擎傳到sql引擎,從而減少上下文切換過程,提升效率。該方法比較適合於在線處理,不必停機。

7.
sqlplus -s user/pwd< runlog.txt

set copycommit 2;

set arraysize 5000;

copy from user/pwd@sid -

to user/pwd@sid -

insert tab1 using select * from tab2;

exit

EOF
用copy的方法進行插入,注意此處insert沒有into關鍵字。該方法的好處是可以設置copycommit和arrarysize來一起控制commit的頻率,上面的方法是每10000行commit一次 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章