資料遷移、測試環境構建、災難恢復、數據倉庫載入——大量資料導入是 DBA 繞不開的硬仗。本文以 10 萬筆、6MB 通話記錄為基準測試集,實測 7 種導入方案的總耗時與 CPU 佔用,揭示核心瓶頸與優化原理,給出場景化選型決策樹。
CALLS:CALL_ID PK, CALL_DATE NOT NULL INDEX, EMP_ID, CALL_TYPE, DETAILS| # | 方案 | 總耗時 (秒) | CPU 時間 (秒) | 速度提升 vs 方案1 | 核心優化原理 |
|---|---|---|---|---|---|
| 1 | 逐行 INSERT (有索引) | 172 | 52 | 基準 | 每行硬解析、索引維護、Redo 生成、回表 |
| 2 | 逐行 INSERT (無索引,事後建索引) | 130 | 35 | 24% ↓ | 避免逐行索引維護,批次建索引更緊湊 |
| 3 | 批量陣列插入 (OCI Array, 100 行/批,無索引事後建) | 14 | 7 | 92% ↓ | 單次解析、減少網路往返、批次綁定、CPU 管線化 |
| 4 | SQL*Loader 傳統路徑 | ~25 | ~15 | 85% ↓ | 外部工具、直接路徑選項、並行載入 |
| 5 | SQL*Loader 直接路徑 | ~18 | ~10 | 90% ↓ | 繞過 SQL 層、直接格式化資料塊、最小化 Redo |
| 6 | 外部表 + INSERT /*+ APPEND */ | ~20 | ~12 | 88% ↓ | SQL 引擎並行、直接路徑寫入、可查詢轉換 |
| 7 | Data Pump (IMPDP) 匯入 DUMP | ~12 | ~8 | 93% ↓ | 並行 Worker、元資料/資料分離、壓縮/加密、網路模式 |
方案 1→2:移除索引後導入,事後建索引,耗時從 172s 降至 130s (24% 提升)。原理:逐行 INSERT 需對每行更新所有索引 (B-Tree 分裂、合併、Redo),而批次建索引採用「排序→建構」單次掃描,產生的索引更緊湊 (無碎片)、Redo 極少 (可 NOLOGGING)。
決策規則:
方案 2→3:OCI 陣列介面 (100 行/批),耗時暴跌至 14s (92% 提升),CPU 從 35s 降至 7s (80% 降低)。原理:
PARSE、單次 EXECUTE 處理 100 行。落地工具:
PreparedStatement.addBatch() + executeBatch() (Oracle JDBC 驅動自動轉 Array Binding)。cx_Oracle.Cursor.executemany() (設定 arraysize)。OracleCommand.ArrayBindCount + 陣列參數。FORALL 批量綁定 (最接近核心,效能最強)。SQL*Loader 直接路徑、INSERT /*+ APPEND */、Data Pump、外部表+APPEND,本質相同:
PARALLEL Hint / SQL*Loader PARALLEL=TRUE / Data Pump PARALLEL=8)。方案 7 最快 (12s),因:
COMPRESSION=ALL)、加密、過濾、重映射表空間/Schema。RESTARTABLE),斷點續傳。COMPRESSION=ALL。COMMIT 頻率每 1-5 萬行。| 參數/選項 | 建議值 | 影響 |
|---|---|---|
SORT_AREA_SIZE / PGA_AGGREGATE_TARGET | 1-2 GB (Session 級) | 索引建構/直接路徑排序在記憶體完成,避免 Temp 落盤 |
NOLOGGING (建索引/直接路徑) | ON | 極大減少 Redo,需事後立即備份 (不可恢復) |
DB_WRITER_PROCESSES | CPU 核心數 / 2 | 加速髒塊刷盤,直接路徑寫入受益 |
FILESYSTEMIO_OPTIONS=SETALL | ASM/Raw Device 必開 | 非同步 I/O + 直接 I/O,繞過 OS 檔案系統快取 |
JDBC oracle.jdbc.batchPerformance | true | 啟用驅動端批量優化 |
DISABLE CONSTRAINT 導入後 ENABLE NOVALIDATE 再 VALIDATE。DISABLE TRIGGER 或改寫為陳述式觸發器/Compound Trigger (11g+)。NLS_LANG 正確設定、外部表 CHARACTERSET 參數、SQL*Loader CHARACTERSET 子句。AUTOEXTEND ON MAXSIZE UNLIMITED。大量資料導入無銀彈,但有鐵律:消除逐行處理、消除索引維護開銷、消除 Redo/Undo 產生、最大化並行度。從 172 秒到 12 秒,93% 的提升來自於對這四大鐵律的極致貫徹。選對工具 (Data Pump/SQL*Loader/Array Binding)、調對參數 (PGA/NOLOGGING/PARALLEL)、避開陷阱 (FK/Trigger/Archive/Charset/Space),導入窗口從「整晚」壓縮至「喝杯咖啡」時間。