2008-09-27 105 views
7

我正在PL/SQL中編寫數據轉換處理數據並將其加載到表中。根據PL/SQL Profiler,轉換最慢的部分之一是實際插入到目標表中。該表具有單個索引。將數據插入Oracle表的最快方式是什麼?

要準備負載數據,我填充使用表的行類型的變量,然後將其插入表是這樣的:

insert into mytable values r_myRow;

看來,我能獲得通過執行以下性能:

  • 打開插入過程中註銷
  • 立即插入多條記錄

這些方法是否明智?如果是這樣,語法是什麼?

回答

14

這是更好地一次插入幾百行,使用PL/SQL表和FORALL綁定到插入語句中。有關詳情,請參閱here

還要小心你如何構建PL/SQL表。如果可能的話,寧願使用「INSERT INTO t1 SELECT ...」直接在SQL中進行所有轉換,因爲在PL/SQL中逐行操作仍然會比SQL慢。

無論哪種情況,您還可以使用INSERT /*+APPEND*/的直接路徑插入,它基本上繞過了數據庫緩存,並直接爲數據文件分配和寫入新的數據塊。這也可以減少日誌記錄的數量,具體取決於您如何使用它。這也有一些影響,所以請先閱讀fine manual

最後,如果您正在截斷並重建表,則可能需要先放下(或標記爲不可用),然後重新構建索引。

0

刪除索引,然後插入行,然後重新創建索引。

+0

使用散裝insetr方法論會減輕那裏有索引的影響。 – 2008-09-27 17:17:08

0

檢查此鏈接 http://www.dba-oracle.com/t_optimize_insert_sql_performance.htm

  1. 要點考慮爲您的 情況下是使用附加提示,這 會直接追加到表 而不是使用空閒列表中。如果你能負擔得起比使用與NOLOGGING暗示追加做
  2. 使用批量插入代替,而不是在PL/SQL迭代的關閉日誌記錄
  3. 使用sqlloaded如果你得到的數據直接加載數據到表從文件進紙
2

常規插入語句是獲取表中數據的最慢方式,而不是用於批量插入。以下文章引用了很多不同的技術來提高性能:http://www.dba-oracle.com/oracle_tips_data_load.htm

+0

該鏈接充滿了可怕的建議。 – 2015-02-04 17:47:31

0

也許你最好的選擇之一是儘可能地避免Oracle。 我自己一直對此感到困惑,但很多時候,Java過程通常會比使用OCI的許多Oracle實用程序(閱讀:SQL Plus)跑得更快,或者將花費你很多時間來正確使用(閱讀:SQL *裝載機)。

這並不妨礙您使用特定的提示(如/ APPEND /)。

每次我轉向那種解決方案時,我都感到驚喜。

乾杯,

羅洛

1

假設你已經採取了開齋節,爲ename,薩爾工作。所以先創建一個表:

SQL>create table tablename(eid number, ename varchar2(20),sal number,job char(10)); 

現在,插入數據: -

SQL>insert into tablename values(&eid,'&ename',&sal,'&job'); 
0

下面是我對快速插入建議。

觸發器 - 禁用與表關聯的任何觸發器。插入完成後啓用。

索引 - 刪除索引並在插入完成後重新創建索引。

陳舊統計信息 - 重新分析表和索引統計信息。

索引解除碎片 - 重建索引(如果需要) 使用不記錄 - 使用INSERT APPEND插入(僅限Oracle)。這種方法是非常危險的方法,因此不會生成重做日誌,因此您無法進行回滾 - 在啓動之前對錶進行備份,並且不要在實時表上進行嘗試。檢查你的分貝是否有類似的選擇

平行插入:運行平行插入將更快地獲得作業。

使用批量插入 約束 - 沒有太多的開銷,在插入的時候,但仍然是一個好主意,檢查,如果仍然緩慢後,即使步驟之後1

您可以瞭解更多關於http://www.dbarepublic.com/2014/04/slow-insert.html

相關問題