国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > 綜合 > 正文

使用insert插入大量數(shù)據(jù)的個人經(jīng)驗總結(jié)

2024-07-21 02:43:52
字體:
供稿:網(wǎng)友
這篇論壇文章根據(jù)筆者的個人經(jīng)驗著重介紹了使用insert插入大量數(shù)據(jù)的常用技巧,更多內(nèi)容請參考下文:

在很多時候,我們會需要對一個表進(jìn)行插入大量的數(shù)據(jù),并且希望在盡可能短的時間內(nèi)完成該工作,這里,和大家分享下我平時在做大量數(shù)據(jù)insert的一些經(jīng)驗。

前提:在做insert數(shù)據(jù)之前,如果是非生產(chǎn)環(huán)境,請將表的索引和約束去掉,待insert完成后再建索引和約束。

1.insert into tab1 select * from tab2;

commit;

這是最基礎(chǔ)的insert語句,我們把tab2表中的數(shù)據(jù)insert到tab1表中。根據(jù)經(jīng)驗,千萬級的數(shù)據(jù)可在1小時內(nèi)完成。但是該方法產(chǎn)生的arch會非常快,需要關(guān)注歸檔的產(chǎn)生量,及時啟動備份軟件,避免arch目錄撐爆。

2.alter table tab1 nologging;

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

commit;

alter table tab1 logging;

該方法會使得產(chǎn)生arch大大減少,并且在一定程度上提高時間,根據(jù)經(jīng)驗,千萬級的數(shù)據(jù)可在45分鐘內(nèi)完成。但是請注意,該方法適合單進(jìn)程的串行方式,如果當(dāng)有多個進(jìn)程同時運行時,后發(fā)起的進(jìn)程會有enqueue的等待。注意此方法千萬不能dataguard上用(不過要是在database已經(jīng)force logging那也是不怕的,呵呵)!!

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

commit;

對于select之后的語句是全表掃描的情況,我們可以加parallel的hint來提高其并發(fā),這里需要注意的是最大并發(fā)度受到初始化參數(shù)parallel_max_servers的限制,并發(fā)的進(jìn)程可以通過v$px_session查看,或者ps -ef |grep ora_p查看。

4.alter session enable parallel dml;

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

commit;

與方法2相反,并發(fā)的insert,尚未比較和方法2哪個效率更高(偶估計是方法2快),有測試過的朋友歡迎補充。

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);

對于分區(qū)表可以利用tab1進(jìn)行多個進(jìn)程的并發(fā)insert,分區(qū)越多,可以啟動的進(jìn)程越多。我曾經(jīng)試過insert 2.6億行記錄的一個表,8個分區(qū),8個進(jìn)程,如果用方法2,單個進(jìn)程完成可能要40分鐘,但是由于是有8個分區(qū)8個進(jìn)程,后發(fā)進(jìn)程有enqueue,所以因此需要的時間為40分鐘×8;但是如果用方法5,雖然單個進(jìn)程需要110分鐘,但是由于能夠并發(fā)進(jìn)程執(zhí)行,所以總共需要的時間就約為110分鐘了。

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)的方式。當(dāng)循環(huán)執(zhí)行一個綁定變量的sql語句時候,在PL/SQL 和SQL引擎(engines)中,會發(fā)生大量的上下文切換(context switches)。使用bulk binding,能將數(shù)據(jù)批量的從plsql引擎?zhèn)鞯絪ql引擎,從而減少上下文切換過程,提升效率。該方法比較適合于在線處理,不必停機(jī)。

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的方法進(jìn)行插入,注意此處insert沒有into關(guān)鍵字。該方法的好處是可以設(shè)置copycommit和arrarysize來一起控制commit的頻率,上面的方法是每10000行commit一次。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 保亭| 勐海县| 罗定市| 日喀则市| 平安县| 林州市| 鞍山市| 武威市| 壶关县| 石狮市| 休宁县| 冕宁县| 兴化市| 大厂| 杭锦旗| 富川| 尼勒克县| 合山市| 鸡泽县| 济宁市| 北安市| 平南县| 灯塔市| 科技| 独山县| 镇坪县| 巴南区| 雷州市| 广河县| 新化县| 娄烦县| 福建省| 长乐市| 独山县| 大田县| 宁武县| 大宁县| 武隆县| 韩城市| 西平县| 远安县|