我正在PL/SQL中編寫數據轉換處理數據並將其加載到表中。根據PL/SQL Profiler,轉換最慢的部分之一是實際插入到目標表中。該表具有單個索引。將數據插入Oracle表的最快方式是什麼?
要準備負載數據,我填充使用表的行類型的變量,然後將其插入表是這樣的:
insert into mytable values r_myRow;
看來,我能獲得通過執行以下性能:
- 打開插入過程中註銷
- 立即插入多條記錄
這些方法是否明智?如果是這樣,語法是什麼?
我正在PL/SQL中編寫數據轉換處理數據並將其加載到表中。根據PL/SQL Profiler,轉換最慢的部分之一是實際插入到目標表中。該表具有單個索引。將數據插入Oracle表的最快方式是什麼?
要準備負載數據,我填充使用表的行類型的變量,然後將其插入表是這樣的:
insert into mytable values r_myRow;
看來,我能獲得通過執行以下性能:
這些方法是否明智?如果是這樣,語法是什麼?
這是更好地一次插入幾百行,使用PL/SQL表和FORALL綁定到插入語句中。有關詳情,請參閱here。
還要小心你如何構建PL/SQL表。如果可能的話,寧願使用「INSERT INTO t1 SELECT ...」直接在SQL中進行所有轉換,因爲在PL/SQL中逐行操作仍然會比SQL慢。
無論哪種情況,您還可以使用INSERT /*+APPEND*/
的直接路徑插入,它基本上繞過了數據庫緩存,並直接爲數據文件分配和寫入新的數據塊。這也可以減少日誌記錄的數量,具體取決於您如何使用它。這也有一些影響,所以請先閱讀fine manual。
最後,如果您正在截斷並重建表,則可能需要先放下(或標記爲不可用),然後重新構建索引。
刪除索引,然後插入行,然後重新創建索引。
檢查此鏈接 http://www.dba-oracle.com/t_optimize_insert_sql_performance.htm
常規插入語句是獲取表中數據的最慢方式,而不是用於批量插入。以下文章引用了很多不同的技術來提高性能:http://www.dba-oracle.com/oracle_tips_data_load.htm
該鏈接充滿了可怕的建議。 – 2015-02-04 17:47:31
如果刪除索引不會加快速度不夠,你需要的Oracle SQL * Loader的:
http://www.oracle.com/technology/products/database/utilities/htdocs/sql_loader_overview.html
您仍然可以使用相同的機制來優化sql * loader使用的負載,而無需使用命令行工具。 – 2008-09-27 17:17:46
也許你最好的選擇之一是儘可能地避免Oracle。 我自己一直對此感到困惑,但很多時候,Java過程通常會比使用OCI的許多Oracle實用程序(閱讀:SQL Plus)跑得更快,或者將花費你很多時間來正確使用(閱讀:SQL *裝載機)。
這並不妨礙您使用特定的提示(如/ APPEND /)。
每次我轉向那種解決方案時,我都感到驚喜。
乾杯,
羅洛
假設你已經採取了開齋節,爲ename,薩爾工作。所以先創建一個表:
SQL>create table tablename(eid number, ename varchar2(20),sal number,job char(10));
現在,插入數據: -
SQL>insert into tablename values(&eid,'&ename',&sal,'&job');
下面是我對快速插入建議。
觸發器 - 禁用與表關聯的任何觸發器。插入完成後啓用。
索引 - 刪除索引並在插入完成後重新創建索引。
陳舊統計信息 - 重新分析表和索引統計信息。
索引解除碎片 - 重建索引(如果需要) 使用不記錄 - 使用INSERT APPEND插入(僅限Oracle)。這種方法是非常危險的方法,因此不會生成重做日誌,因此您無法進行回滾 - 在啓動之前對錶進行備份,並且不要在實時表上進行嘗試。檢查你的分貝是否有類似的選擇
平行插入:運行平行插入將更快地獲得作業。
使用批量插入 約束 - 沒有太多的開銷,在插入的時候,但仍然是一個好主意,檢查,如果仍然緩慢後,即使步驟之後1
您可以瞭解更多關於http://www.dbarepublic.com/2014/04/slow-insert.html
使用散裝insetr方法論會減輕那裏有索引的影響。 – 2008-09-27 17:17:08