DB2 9.5 為將 XML 數據遷移至資料表提供了三種途徑:INSERT 插入、IMPORT 導入與LOAD 裝載。從調優視角看,INSERT 與 IMPORT 特性相近,因 IMPORT 實質執行一系列 INSERT 操作。而 LOAD 工具優勢顯著:無需記錄日誌、自動啟用並行處理,DB2 依據 CPU 數量與表空間容器自動判定並行度,大幅提升吞吐量。不過,INSERT 與 IMPORT 允許在其他事務運行時寫入數據、完整校驗約束與觸發器,適用於線上業務場景。
實務中,採用 ETL 中間過渡表 策略——先將 XML 載入暫存表,再填充目標表——往往能兼顧性能與數據質量。
ALTER TABLE <表名> APPEND ON,新數據直接追加至表尾,省去尋找空閒頁面的開銷。業務常將海量細粒度 XML(如 FpML 交易)聚合為單一大文檔(根元素 <alltrades> 包裹多個 <FpML> 片段)。雖便於傳輸,但存為單一行將嚴重拖垮查詢與更新性能。最佳實踐是入庫時拆分為獨立行。
DB2 支持最高 2GB XML 文檔,配合 XMLTABLE 函數可在單條 INSERT 中完成拆分:
INSERT INTO trades(tradedoc)
SELECT doc FROM
XMLTABLE ('$d/alltrades/FpML' passing cast(? as XML) as "d"
COLUMNS
doc XML PATH 'document{.}') AS X
關鍵點:document{.} 構造器為每個提取的子樹創建文檔節點,確保生成良好格式的 XML 文檔。若目標表含關係型列(如 tradeId),可定義為自動生成列,或從 XML 中提取值同步填充(詳見混合存儲章節)。
將高頻訪問、需建立主外鍵或組合索引的字段(交易日期、類型、交易方 ID 等)提取至關係型列,完整 FpML 文檔存入 XML 列,形成混合存儲模式。優勢顯著:
插入示例:
create table trades2 (trdDate Date, trdType varchar(20), partyId1 integer,
partyId2 integer, tradedoc XML);
insert into trades2
select *
from xmltable('$d/FpML' passing cast(? as XML) as "d"
columns
tradeDate date path 'trade/tradeHeader/tradeDate',
tradetype varchar(20) path 'trade/*[2]/local-name(.)',
partyId1 integer path 'party[@id="party1"]/partyId',
partyId2 integer path 'party[@id="party2"]/partyId',
doc XML path 'document{.}') as t;
一致性保障:將上述邏輯封裝於存儲過程,統一入口插入;或建立 BEFORE INSERT 觸發器強制從 XML 派生關係列值,杜絕單獨操作關係列導致的不一致。
首選方案:在 DB2 註冊 XML Schema,插入/更新時調用 XMLVALIDATE 驗證。FpML 等標準版本迭代快,需註冊多版本 Schema(如 4.1、4.2、4.3、5.0)。
驗證策略三選一:
INSERT ... VALUES (?, xmlvalidate(? according to XML schema ID matthias.fpml43)),靈活控制每筆文檔驗證邏輯。CHECK (tradedoc IS VALIDATED) 或限定 Schema 白名單 CHECK (tradedoc IS VALIDATED ACCORDING TO XMLSCHEMA ID IN (...))。注意:約束僅檢查「已驗證」標記,不執行驗證。事後審計:XMLXSROBJECTID(tradedoc) 可返回文檔驗證所用 Schema ID,配合系統目錄 SYSCAT.XSROBJECTS 可追溯具體 Schema 定義。