2011-08-17 13 views
5

在過去的幾天裏,我一直在使用Oracle的SQL * Loader來嘗試將數據批量加載到Oracle中。在嘗試了不同的選項組合後,我驚訝地發現傳統路徑負載比直接路徑負載快得多。在直接模式下運行的Oracle SQL * loader比傳統的路徑加載慢得多

有關問題的幾個事實:

  • 的記錄數加載是60K。
  • 加載前目標表中的記錄數爲7億。
  • Oracle版本是11g r2。
  • 數據文件包含日期,字符(ascii,不需要轉換),整數,浮點數。沒有blob/clob。
  • 表是按散列分區的。散列函數與PK相同。
  • 表的並行設置爲4,而服務器有16個CPU。
  • 索引是本地分區的。並行索引(來自ALL_INDEXES)爲1.
  • 目標表上只有1個PK和1個索引。使用索引建立PK約束。
  • 檢查索引分區顯示分區間的記錄分佈非常均勻。
  • 數據文件是分隔的。
  • 使用APPEND選項。
  • 通過SQL選擇和刪除加載的數據非常快,幾乎是即時響應。

使用傳統路徑,加載在大約6秒內完成。

使用直接路徑加載時,加載大約需要20分鐘。最糟糕的運行需要1.5小時,至 完成,但服務器根本不忙。

如果啓用skip_index_maintenance,則直接路徑加載將在2-3秒內完成。

我已經嘗試了很多選項,但是沒有一個給出明顯的改進...不可撤銷的,排序的索引,多線程(我在多CPU服務器上運行SQL * Loader)。他們都沒有改善這種情況。

這裏是等待事件我不停的時間SQL中看到* Loader的直接模式運行:

  • 事件:DB文件順序讀取
  • P1/2/3:文件#,塊#,塊(從DBA_EXTENTS檢查,這是一個索引塊)
  • 等待類:用戶I/O

有沒有人有任何想法出了什麼問題,直接路徑負載?還是有什麼我可以進一步檢查,真正挖掘問題的根源?提前致謝。

回答

3

我猜你的下降禽這個

「當加載一個相對較小的行成一個大的索引表

在直接路徑負載,當它與合併現有的索引被複制新的索引鍵如果現有的索引非常大並且新鍵的數量非常小,那麼索引複製時間可以抵消由直接路徑負載節省的時間。

從何時使用常規路徑加載:http://download.oracle.com/docs/cd/B14117_01/server.101/b10825/ldr_modes.htm

+0

你知不知道這是否行爲只發生了SQL加載或者它的行爲與插入附加的方式一樣嗎?我做了一個非常快速的測試,它似乎沒有複製我現有的索引(約92Meg),當我插入100行附加提示。 –

+0

我不知道,我猜如果你試圖插入附加60K行它會表現出相同的行爲 –

+0

謝謝凱文。當我掃描SQL * Loader的文檔時,我完全錯過了該部分。但是,將大量數據加載到具有相對大量記錄的非空表中的最佳方法是什麼? – Stanley

相關問題