在過去的幾天裏,我一直在使用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
有沒有人有任何想法出了什麼問題,直接路徑負載?還是有什麼我可以進一步檢查,真正挖掘問題的根源?提前致謝。
你知不知道這是否行爲只發生了SQL加載或者它的行爲與插入附加的方式一樣嗎?我做了一個非常快速的測試,它似乎沒有複製我現有的索引(約92Meg),當我插入100行附加提示。 –
我不知道,我猜如果你試圖插入附加60K行它會表現出相同的行爲 –
謝謝凱文。當我掃描SQL * Loader的文檔時,我完全錯過了該部分。但是,將大量數據加載到具有相對大量記錄的非空表中的最佳方法是什麼? – Stanley