Dot-Net

OracleBulkCopy 與 SQL*Loader 性能對比

  • February 17, 2012

當 Oracle 伺服器位於另一台電腦上時,我發現 OracleBulkCopy (ODP.NET) 和 SQL*Loader 之間存在一些顯著的性能差異。

我在 Oracle 中有一個非常基本的表,其中包含三列(一個 BINARY_FLOAT,兩個 NUMBER(18,0))。沒有主鍵、索引、觸發器等。它用作臨時表將批量數據獲取到數據庫中。

SQL*Loader 將 450 萬行載入到表中大約需要 27 秒。

OracleBulkCopy 只需大約 10 分鐘即可載入 100 萬行。

OracleBulkCopy,根據文件,"…使用直接路徑載入方法,與 Oracle SQLLoader 相似但不同。"* 就性能而言,它可能與 SQL*Loader 不一樣,但這種差異是荒謬的。

在對網路流量進行一些基本分析後,我發現 OracleBulkCopy 正在發送和接收大量小數據包。我使用 Wireshark 比較了每個數據包,發現了一些有趣的結果。

SQL*Loader - 在初始連接握手之後 - 發送一系列8 KB數據包(TNS 協議)並接收60 字節 ACK作為響應。

OracleBulkCopy 發送一系列102 字節數據包(TNS 協議)並接收一個133 字節數據包(TNS 協議)作為響應。什麼……!?就像一次發送一排一樣!

對於 OracleBulkCopy 類,我使用 100,000 的批處理大小,並使用自定義IDataReader從數據文件中讀取。

所以,我的問題是:

  • 有沒有人見過這種行為?
  • OracleBulkCopy 是否實際上作為批量載入工具執行?
  • 我需要配置什麼才能使其正常工作嗎?(客戶端/伺服器設置等)

任何幫助深表感謝。

我收到了甲骨文產品經理 Alex Keh 的回复,甲骨文“也注意到了這個問題。我們正在評估如何修復這個錯誤。”

因此,在回答我自己的問題時,我猜 OracleBulkCopy作為批量載入工具表現不佳**。**至少目前不是。

我將包裝 SQL*Loader 作為替代解決方案,因為錯誤修復中沒有 ETA。

引用自:https://stackoverflow.com/questions/9106366