LOAD 工具最大優勢在於以資料頁層級處理資料,繞過 DBMS 多層處理邏輯,極大提升載入速度。除工具本身特性外,合理配置選項可進一步釋放效能。以下列出關鍵選項與建議設定:
指定 LOAD 同時使用 n 個邏輯 CPU 並行處理剖析、轉換、格式化等任務。資料量大且 OS 負載低時可設定多 CPU;若同時啟動多個 LOAD,所有實例的 CPU_PARALLELISM 總和最好不超過邏輯 CPU 總數。不指定時 DB2 依 CPU 數量自動分配。
指定 LOAD 可用的最大資料緩衝區(單位 4KB)。在不超過實體記憶體前提下,緩衝區越大效能越好,但受 UTIL_HEAP_SZ 限制。建議單一 LOAD 不超過 UTIL_HEAP_SZ 的 50%,實際值需觀察工具堆使用高水位決定。緩衝區夠大後再增加效益遞減,需實測找最佳值。
指定 LOAD 可利用表空間多容器並行 I/O 能力,依容器數量適度設定。
利用輸入檔預設排序提升效能。若輸入檔來自帶排序謂詞的 EXPORT,效能可提升數倍至數十倍,支援所有檔案格式。
降低對輸入資料檢查以提速。僅適用 ASC/DEL 格式,且輸入資料結構、型別與目標表完全一致時使用。
預期大量警告時啟用,減少警告處理開銷。
降低一致性恢復點設定負載。大資料量時依筆數設定(如 1000 萬行設 10000)。不可與 ANYORDER 同時使用。
表有大量索引且表/索引空間不大時,指定系統暫存表空間加速索引建立。
LOAD 除支援 IXF/ASC/DEL 檔案,也可直接從游標讀取資料。將一表資料搬移到結構相同的另一表時,游標方式省去「導出寫檔」與「載入讀檔」兩次 I/O,大幅提升效率。
-- test.sql
DECLARE cursor mycur FOR SELECT * FROM tab1name;
LOAD FROM mycur OF CURSOR INSERT INTO tab2name;
執行:db2 connect to dbname && db2 -tvf test.sql。游標 SQL 可自訂,LOAD 選項亦可按需調整。
跨資料庫移動資料常遇碼頁不一致:
MODIFIED BY CODEPAGE=xxx 指定來源碼頁。LOAD FROM test OF DEL MODIFIED BY CODEPAGE=819 INSERT INTO tabnameFORCEIN。LOAD FROM test OF IXF MODIFIED BY FORCEIN INSERT INTO tabname結構完全相同仍出現非空字元或截斷錯誤時,IXF + FORCEIN 可規避。
DB2 V8/V9.1 載入時若資料不符型別被截斷/拒絕,錯誤訊息顯示如 F4-6(第 4 CPU 處理的第 6 行),無法直接對應來源檔總行號。解法:設 CPU_PARALLELISM=1 強制單 CPU,行號即為總行號。
DB2 V9.5 新增 SQL3227W 直接輸出使用者記錄號(如 Record "F4-6" refers to user record "16"),免去單 CPU 限制。
ALLOW READ ACCESS → 後續查詢可並行執行。IMPORT 替代 LOAD。使用 LIST UTILITIES SHOW DETAIL 觀察執行階段與進度:
ID = 5
Type = LOAD
Database = SAMPLE
Phase 1: SETUP
Phase 2 [Current]: LOAD, Total = 2174631 rows, Completed = 1106547 rows
若有索引會有第三階段 BUILD。以 總工作量 vs 已完成工作量 比例估算剩餘時間。
表不可用時(如處於「裝入暫掛」),無 LIST TABLE 可用。改用 LOAD QUERY TABLE tabname 可取得表狀態、階段、已讀/載入/拒絕行數等資訊,據以決定 RESTART 或 TERMINATE 恢復存取。
四種清空方式比較:
DELETE FROM tablename:消耗大量時間與 Log,極不推薦。ALTER TABLE ... ACTIVATE NOT LOGGED INITIALLY; DELETE ...:需同一事務執行,操作繁瑣。ALTER TABLE ... ACTIVATE NOT LOGGED INITIALLY WITH EMPTY TABLE:較好,但缺乏故障控制。LOAD FROM emptyfile OF DEL REPLACE INTO tablename(推薦):同樣快速,且支援 RESTART/TERMINATE 故障控制,過程更可控。