Java

Oracle 11g:插入的性能改進

  • March 26, 2013

我有一個包含 5 億行(並且還在增長)的表

我做了以下操作來提高插入的性能:

在數據庫方面:

  • 刪除所有索引和約束
  • 禁用日誌記錄

在應用方面:

  • 從 JPA 託管實體切換到本機插入查詢,向查詢添加了 APPEND Oracle 提示
  • 嘗試每 1k/2k/3k 行分批送出
  • 嘗試並行寫入(多個執行緒,執行緒數 = 伺服器上的核心數)到一張表

這給了我大約 300 行每秒

另外嘗試:

  • 批量並行寫入多個表(使用 UNION 分組然後返回結果)

這給了我每秒大約 1k 行,但在空表上。但是當我用虛擬數據(每張 2 億)填充表時,插入速度下降到每秒 250 到 300 次。

誰能建議我還能做些什麼來加快插入速度?基本上我想先了解什麼是(可能是)瓶頸。

UPD: 表按插入日期分區,表大約有 60 列 - 大多數列是 VARCHAR2(2000 BYTE)

剛剛看到更新的 60-col 表,其中大部分是 VARCHAR(2k) 欄位——這(可能)是一個怪物表。

第一件事首先

您必須首先了解您的瓶頸。在應用程序方面,一直回到您的單執行緒批量插入解決方案(一次 1/2/3k)並開始執行它並登錄到數據庫機器並執行“頂部”——看看有多少數據庫程序花費的時間以及機器顯示的時間(如果有的話)wa%。

如果 top 向您顯示任何 wa% 時間,這意味著您的數據庫受 I/O 限制,您可能需要考慮多台數據庫機器(分片)或考慮在主機上放置 SSD。

而已; 你的研究到此為止。數據庫佔用多少 CPU 或您的應用程序客戶端有多飽和並不重要;如果您在主機 DB 上遇到 I/O 延遲問題,那將是您的最佳選擇。

提示如果硬體更改是不可能的,根據您正在執行的文件系統 (Linux),您可以嘗試禁用數據庫的日誌記錄或元數據寫入,以稍微提高文件系統級別的性能。你可以在 NTFS 上做類似的事情,但這只會給你一點提升。這不會是 2 倍。

現在,第二件事…

假設您幾乎沒有 wa% 時間,但您的 CPU 完全由 DB 程序固定。您現在唯一的選擇是引入更多的數據庫機器(分片)並拆分工作。

同樣,如果是這種情況,您的研究就完成了。您無法做任何事情來調整 CPU 以更快地執行。

最後,第三件事……第三……

假設數據庫沒有做任何事情。然後,轉到執行批量插入的客戶端機器並檢查 CPU 負載——它是否已固定?如果是這樣,啟動更多機器執行完全相同的批量插入,看看是否可以獲得線性斜坡。

如果 CPU 沒有固定,請在同一台機器上啟動更多執行緒,直到它固定並查看數據庫的擴展方式。

我想您可能已經嘗試過了,所以我的猜測是您的客戶端主機已經固定(並且更多執行緒不會產生影響)或者數據庫已經達到其極限並且無法進一步擴展。

附錄

在沒有垃圾的未索引表上執行原始插入本質上是一個 APPEND 操作,該操作的速度應該與磁碟可以處理寫入的速度一樣快。

在同一台主機上創建更多表無濟於事,如果有的話,它會增加您的磁碟查找(以獲取磁碟上要附加的其他表)並減慢速度。

首先找出瓶頸至關重要,然後我們可以優化它。

希望有幫助!隨時通知我們。

引用自:https://dba.stackexchange.com/questions/37557