在很多時候,我們會需要對乙個表進行插入大量的資料,並且希望在盡可能短的時間內完成該工作,這裡,和大家分享下我平時在做大量資料insert
的一些經驗。
前提:在做insert
資料之前,如果是非生產環境,請將表的索引和約束去掉,待insert完成後再建索引和約束。
insert
into tab1 select
*from tab2;
commit
;
這是最基礎的insert
語句,我們把tab2表中的資料insert
到tab1表中。根據經驗,千萬級的資料可在1小時內完成。但是該方法產生的arch
會非常快,需要關注歸檔的產生量,及時啟動備份軟體,避免arch
目錄撐爆。
alter table tab1 nologging;
commit;
alter table tab1 logging;
該方法會使得產生arch
大大減少,並且在一定程度上提高時間,根據經驗,千萬級的資料可在45分鐘內完成。但是請注意,該方法適合單程序的序列方式,如果當有多個程序同時執行時,後發起的程序會有enqueue
的等待。注意此方法千萬不能dataguard
上用(不過要是在database
已經force logging
那也是不怕的,呵呵)!!
insert
into tab1 select
/*+ parallel */
*from tab2;
commit
;
對於select
之後的語句是全表掃瞄的情況,我們可以加parallel
的hint
來提高其併發,這裡需要注意的是最大併發度受到初始化引數parallel_max_servers
的限制,併發的程序可以通過v$px_session
檢視,或者ps -ef |grep ora_p
檢視。
alter
session
enable parallel dml;
insert
/*+ parallel */
into tab1 select
*from tab2;
commit
;
與方法2相反,併發的insert
,尚未比較和方法2哪個效率更高(偶估計是方法2快),有測試過的朋友歡迎補充。
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
,分割槽越多,可以啟動的程序越多。我曾經試過insert
2.6億行記錄的乙個表,8個分割槽,8個程序,如果用方法2,單個程序完成可能要40分鐘,但是由於是有8個分割槽8個程序,後發程序有enqueue
,所以因此需要的時間為40分鐘×8;但是如果用方法5,雖然單個程序需要110分鐘,但是由於能夠併發程序執行,所以總共需要的時間就約為110分鐘了。
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 in1.
. v_col1.count
insert
into tab1 where tab1.col1 = v_col1;
end;
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
一次。 Oracle insert大量資料經驗之談
在很多時候,我們會需要對乙個表進行插入大量的資料,並且希望在盡可能短的時間內完成該工作,這裡,和大家分享下我平時在做大量資料insert的一些經驗。前提 在做insert資料之前,如果是非生產環境,請將表的索引和約束去掉,待insert完成後再建索引和約束。1.insert into tab1 se...
Oracle insert大量資料經驗之談
在很多時候,我們會需要對乙個表進行插入大量的資料,並且希望在盡可能短的時間內完成該工作,這裡,和大家分享下我平時在做大量資料insert的一些經驗。前提 在做insert資料之前,如果是非生產環境,請將表的索引和約束去掉,待insert完成後再建索引和約束。1.insert into tab1 se...
oracle insert的擴充套件
向乙個表發散彈槍 insert into table name column column.select statement 每次只能插入乙個表,但效能上比寫多條insert語句要高。另外,oracle還提供create table table name as select as不可少!實現直接建立...