首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle 大量數據插入性能優化:從 10 萬到 100 萬的實戰調優路徑

     編輯:Oracle 資料庫基礎

問題背景

Java + JDBC (ODBC) 批量插入,單條提交導致 10 萬條數據即 OOM (OutOfMemoryError),DB 端處理時間極長。

優化演進路線圖

階段做法結果
1. 原始List 循環逐條 INSERT + COMMIT10萬 OOM,極慢
2. 批處理 (addBatch/executeBatch)每 1000 條 executeBatch() + COMMIT + clearBatch()仍 OOM (JVM 端緩衝區積壓)
3. 文件流式讀取 + 分批提交File.list() → ArrayList 分批 → PreparedStatement + 批處理100萬條測試,**每 1 萬條提交性能最優**

關鍵代碼片段

JDBC 批處理模板

String sql = "INSERT INTO TARGET_TABLE (COL1, COL2, ...) VALUES (?, ?, ...)";
PreparedStatement ps = conn.prepareStatement(sql);
conn.setAutoCommit(false);

int batchSize = 10000;  // 經測試最優
int count = 0;

while (hasNextRecord()) {
    ps.setString(1, val1);
    ps.setString(2, val2);
    // ...
    ps.addBatch();
    
    if (++count % batchSize == 0) {
        ps.executeBatch();
        conn.commit();
        ps.clearBatch();  // 必須清理,否則 JVM 記憶體持續增長
    }
}

// 尾批提交
if (count % batchSize != 0) {
    ps.executeBatch();
    conn.commit();
}
ps.close();

文件流式讀取避免全量載入

String[] fileList = new File(uploadDir).list();
List batch = new ArrayList<>(batchSize);

for (String file : fileList) {
    try (BufferedReader br = new BufferedReader(new FileReader(file))) {
        String line;
        while ((line = br.readLine()) != null) {
            batch.add(parseLine(line));
            if (batch.size() >= batchSize) {
                insertBatch(batch);
                batch.clear();
            }
        }
    }
}
if (!batch.isEmpty()) insertBatch(batch);

核心經驗總結

  1. 批量提交閾值需實測:本案例 10,000 條最優;太小頻繁提交慢,太大 JVM OOM
  2. 必須 clearBatch():JDBC 驅動內部緩衝不自動釋放
  3. 關閉自動提交:conn.setAutoCommit(false),手動控制事務邊界
  4. 預編譯語句:PreparedStatement 復用执行計劃,防注入
  5. 流式處理文件:避免 readAllLines() 類全量載入撐爆堆內存
  6. 適當調大 JVM 堆:-Xmx2g -Xms2g 配合批處理更穩健

進階方向

  • SQL*Loader 直接路徑載入 (繞過 SQL 引擎,速度更快)
  • 外部表 (CREATE TABLE ... ORGANIZATION EXTERNAL) + INSERT /*+ APPEND */
  • 分區表 + 並行 DML (ALTER SESSION ENABLE PARALLEL DML)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved