2014-11-03 29 views
1

我在寫一個Java程序,它創建一個符合特定分佈參數的6,800,000條記錄的CSV文件,並使用Oracle的SQL * Loader填充一個表。如何調整Oracle的SQL * Loader追加?

我正在測試我的程序使用不同大小的記錄(50,000和500.000)。生成CSV文件本身非常快速,使用併發性需要幾毫秒的時間來創建並將這些記錄插入到文件中。

另一方面,插入所述記錄花費的時間太長。讀取由SQL * Loader生成的日誌文件時,需要00:00:32.90秒來填充表中的50,000條記錄和00:07:58.83分鐘以使用500,000填充它。

SQL * Loader基準我搜索了一下,表現出好得多的性能,比如不到2分鐘就有200萬行。我按照this tutorial來改善時間,但幾乎沒有改變。這裏顯然有些問題,但我不知道是什麼。

這是我的控制文件:

OPTIONS (SILENT=ALL, DIRECT=TRUE, ERRORS=50, COLUMNARRAYROWS=50000, STREAMSIZE=500000) 
UNRECOVERABLE LOAD DATA 
APPEND 
INTO TABLE MY_TABLE 
FIELDS TERMINATED BY "," 
TRAILING NULLCOLS 
... 

另一個重要的信息:我已經使用並行= TRUE試過,但我得到了ORA-26002錯誤(表MY_TABLE已在其上定義的索引)。不幸的是,使用skip_index_maintenance運行會導致索引UNUSABLE。

我在做什麼錯?


更新

我注意到,運行的程序(不到一秒鐘)後不久,所有的行已經存在於數據庫中。但是,SQL * Loader仍然很忙,只能在32-45秒後結束。

它可以做什麼?

回答

1

一個想法是創建一個外部表並將名稱設置爲csv文件。然後在創建文件後,您可以在Oracle內部運行一個sql腳本來直接處理數據。

或者,看看下面的(複製從here :)

這個問題是使用批量加載選項時並行加載上有一個索引的Oracle目標造成的。 Oracle限制。

要解決此問題,請執行下列操作之一:

·更改目標負載選項正常。

·在關係連接瀏覽器中禁用啓用並行模式選項。

·加載前刪除索引。

·或者創建前和會後的SQL刪除和創建索引和鍵約束

+0

好一個...滴速,並重新創建索引是不是一種選擇,我會用傳統的插入嘗試.. – Tarek 2014-11-04 11:25:45

+0

傳統路徑佔用了更多時間......我想問題在於使用的表或數據庫內,我會請DBA來看看。 – Tarek 2014-11-05 10:52:22