Oracle insert大量資料經驗之談
在很多時候,我們會需要對一個表進行插入大量的資料,並且希望在儘可能短的時間內完成該工作,這裡,和大家分享下我平時在做大量資料insert
的一些經驗。
前提:在做insert
資料之前,如果是非生產環境,請將表的索引和約束去掉,待insert完成後再建索引和約束。
insert into tab1 select * from tab2;
commit;
這是最基礎的insert
語句,我們把tab2表中的資料insert
到tab1表中。根據經驗,千萬級的資料可在1小時內完成。但是該方法產生的arch
會非常快,需要關注歸檔的產生量,及時啟動備份軟體,避免arch
目錄撐爆。
alter table tab1 nologging;
insert /*+ append */ into tab1 select * from tab2;
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 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
引擎,從而減少上下文切換過程,提升效率。該方法比較適合於線上處理,不必停機。
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 all into用法Oracle
- Hugo 建站經驗之談Go
- oracle-資料庫- insert 插入語句Oracle資料庫
- puppeteer踩坑經驗之談
- 資料庫的日常管理經驗淺談資料庫
- Oracle中的insert/insert all/insert firstOracle
- mybatis怎麼實現insert into多個資料-oracle資料庫MyBatisOracle資料庫
- 經驗談
- oracle資料庫開發的一些經驗Oracle資料庫
- 網易資料基礎平臺建設經驗談
- 經驗談集
- 扎心!一個3年經驗的程式設計師經驗之談!程式設計師
- ORACLE資料校驗文件Oracle
- lightdb -- merge into insert 相容 OracleOracle
- Oracle-insert into加日期Oracle
- 用過 Buffalo 框架的朋友有何經驗之談框架
- 作為 CEO 使用 Emacs 的兩年經驗之談Mac
- MPP平臺實施工具,實施經驗+銀行資料倉儲模型建設經驗泛談模型
- 資料庫日常管理 ? 我有這些經驗淺談交給你資料庫
- 大量表格資料(>10萬條)使用PLSQL快速匯入OracleSQLOracle
- 【MySQL】四、Insert buffer 漫談MySql
- 必看!網際網路開發模式的經驗之談模式
- 從微服務遷移到工作流的經驗之談微服務
- 經驗之談:記憶體洩露的原因以及分析記憶體洩露
- 拿三個專案,跟你聊聊Oracle資料庫資料遷移的一些經驗Oracle資料庫
- 資料倉儲經驗概念
- 伺服器開發中網路資料分析與故障排查經驗漫談伺服器
- [原創]分散式系統之快取的微觀應用經驗談(三)【資料分片和叢集篇】分散式快取
- Android SDK 開發經驗淺談Android
- 邦芒寶典:職場前輩的6條經驗之談
- 經驗之談:程式碼該怎樣寫才能乾淨整潔
- 攝像頭 ISP 除錯的入門之談(經驗總結)除錯
- Oracle資料庫恢復之resetlogsOracle資料庫
- Oracle資料庫密碼延遲驗證Oracle資料庫密碼
- 初創公司資料科學專案全流程指南,一位資深資料科學家的經驗談資料科學
- Oracle實驗6--掌握Oracle資料庫的日誌操作Oracle資料庫
- LeetCode之Insert Interval(Kotlin)LeetCodeKotlin
- SQLite 之 INSERT OR REPLACE使用SQLite