資料庫上線前的大量資料匯入 (Initial Load) 是專案交付關鍵路徑。DB2 提供 IMPORT (行級處理、觸發器生效) 與 LOAD (頁級直寫、高效能) 兩大工具,但實際操作中常遇預設值失效、效能瓶頸、日誌暴增、格式不符等問題。本文歸納四大核心場景與解決方案,助您順利完成資料遷移。
目標表欄位定義 DEFAULT 'SYSDATE' 且 NOT NULL,匯入檔案該欄位為空,結果寫入 NULL 導致錯誤,或寫入 NULL 而非預期預設值。
IMPORT/LOAD 預設不使用資料表定義的 DEFAULT 值,空欄位直接寫入 NULL。NOT NULL 約束 → 匯入失敗 (SQL0407N)。NULL → 靜默寫入 NULL,業務邏輯錯誤。# IMPORT 指定 USEDEFAULTS 選項
db2 "import from data.del of del modified by usedefaults insert into target_table"
# LOAD 同樣支援
db2 "load from data.del of del modified by usedefaults insert into target_table"
效果:檔案欄位有值 → 用檔案值;檔案欄位為空 → 自動套用 DEFAULT 定義。建議:所有 NOT NULL + DEFAULT 欄位匯入必加 USEDEFAULTS。
| 手段 | 適用工具 | 原理 | 典型提升 |
|---|---|---|---|
選擇 LOAD 而非 IMPORT |
LOAD | 繞過 SQL 層、不寫日誌 (可選)、頁級直寫容器 | 10x - 100x |
客戶端匯入加 COMPOUND=x |
IMPORT/LOAD (CLP) | 將 x 筆記錄打包為一個網路封包,減少往返延遲,客戶端讀檔與伺服器寫入流水線並行 | 2x - 5x (WAN 環境更明顯) |
設定 COMMITCOUNT n / SAVECOUNT n |
IMPORT / LOAD | 每 n 筆提交/存檔點,避免單一巨大交易撐爆作用中日誌空間,失敗時可從上一存檔點 RESTARTCOUNT 續傳 |
避免失敗重頭來過,間接提升整體吞吐 |
# LOAD 範例 (非可恢復表空間可加 NONRECOVERABLE 進一步提速)
db2 "load from data.del of del
modified by compound=100 usedefaults
savecount 5000
messages load.msg
insert into target_table nonrecoverable"
# IMPORT 範例
db2 "import from data.del of del
modified by compound=100 usedefaults
commitcount 500
restartcount 0
messages imp.msg
insert into target_table"
注意:SAVECOUNT/COMMITCOUNT 過小 (如 100) 會頻繁同步降低效能;過大 (如 100,000) 風險集中。建議 500-5,000 區間根據日誌空間與網路延遲調整。
大量 INSERT 產生海量作用中日誌,觸發 SQL0964C (交易日誌滿) 導致匯入中斷,且無 COMMITCOUNT 時整筆交易回滾,耗時極長。
COMMITCOUNT n (IMPORT) 或 SAVECOUNT n (LOAD),建立定期提交/存檔點。N。RESTARTCOUNT N 跳過已匯入資料:db2 "import from data.del of del
modified by compound=100 usedefaults
commitcount 500
restartcount 125000
messages imp_restart.msg
insert into target_table"
此機制將「全量重跑」轉為「增量續傳」,大幅降低失敗成本。
;、Tab \t、豎線 |)MODIFIED BY filetype-mod 修飾符| 場景 | 修飾符範例 | 說明 |
|---|---|---|
| 欄位分隔符為分號 | coldel; |
覆蓋預設逗號 |
| 欄位分隔符為 Tab | coldel\x09 |
十六進位表示 |
| 字串引號為單引號 | chardel' |
預設雙引號 |
| 記錄分隔符非換行 (固定長度) | reclen=120 |
指定記錄長度 |
| 多行記錄 (換行符優先級過高) | delprioritychar |
關鍵:提升欄位分隔符優先級高於記錄分隔符,避免單筆記錄被拆成多行 |
db2 "import from data.csv of del
modified by coldel; chardel\" delprioritychar usedefaults
commitcount 1000
messages imp.log
insert into target_table"
匯入前檢查清單
CODEPAGE 一致 (或指定 codepage=xxx)USEDEFAULTS、COMPOUND、COMMITCOUNT/SAVECOUNTCOLDEL、CHARDEL、DELPRIORITYCHARLOGFILSIZ、LOGPRIMARY、LOGSECOND)RESTARTCOUNT)