三種 XML 存儲模式對決
DB2 V8 XML Extender 提供兩種模式:CLOB 存儲(完整文檔作非結構化文本)與分解式存儲(映射至關聯表)。DB2 9 引入 pureXML,以原生階層格式(節點樹)存儲 XML,於插入時解析、查詢時遍歷樹結構,旨在消除前兩者效能瓶頸。
測試環境與資料
- 4-CPU pSeries,AIX 5.2 (64-bit),單一 DB2 9 實例
- 1,000~100,000 筆 CustAcc 文檔(4KB~20KB),金融情境
- 32KB 頁面 DMS 表空間,
NO FILE SYSTEM CACHING,10 顆實體磁碟條帶化,日誌獨立
- 相同資料庫配置與調優,確保公平比較
CLOB vs pureXML:插入效能
單用戶:CLOB 勝出但代價隱現
- 無索引:CLOB 插入耗時約 pureXML 53%(避免解析)
- 維護 6 個 XML 索引:pureXML 僅增 5% 開銷;CLOB 維護「索引表」需解析+關聯插入,反而比 pureXML 慢 23%
多用戶併發:pureXML 反超
- 10 併發執行緒:CLOB 插入變慢 2 倍(207% 基準),pureXML 僅 37% 基準(5 倍加速)
- 原因:XML 列緩衝插入併發擴展性優於 CLOB 直接寫入
CLOB vs pureXML:查詢效能
五大查詢類型測試
- 全文檔檢索無謂詞
- 單謂詞單文檔檢索
- 多謂詞多文檔檢索
- 部分欄位全文檢索
- 部分欄位帶謂詞檢索
無索引場景:pureXML 碾壓
- Q2~Q5(需子文檔存取):pureXML 快 7~44 倍(查詢時免解析)
- Q1(全表掃描):無檔案系統快取時兩者接近;啟用快取後 CLOB 快 2 倍以上(XML 需序列化)
有索引場景:pureXML 仍大幅領先
- CLOB 依賴「索引表」(插入時提取鍵值至關聯表),查詢需聯結索引表+主表
- pureXML 原生 XML 索引直接指向文檔列,無額外聯結
- Q3(5 謂詞,3 索引表+主表=4 路聯結)CLOB 慢 35 倍;Q5 需提取函數解析,pureXML 快 6 倍
資料量增長:效能差距線性擴大
隨文檔數 1,000→100,000,CLOB 查詢回應時間線性惡化,pureXML 穩定優異。
分解式存儲 vs pureXML
插入效能
- 每文檔提交(OLTP):pureXML 快 1.75 倍
- 批次提交(每 50/100 文檔):pureXML 快 4~5 倍(日誌 I/O 效率更高)
- DB2 9 新分解(注釋模式分解)比 V8 XML Extender 分解快 7~8 倍;pureXML 更快 30 倍
查詢效能:XQuery vs SQL/XML 發布
- Q2(單文檔):SQL/XML 聯結 12 表+建構 XML,慢 75 倍
- Q1/Q3(多文檔):發布成本隨聯結表數爆炸,pureXML 極大優勢
- Q4(部分欄位重構):兩者瓶頸均在建構,效能接近
- Q5(簡單搜尋少量標記):SQL/XML 反勝 20 倍(關聯搜尋較快、建構少)
結論與建議
| 操作 | pureXML vs CLOB | pureXML vs 分解式 |
| 單用戶插入 | CLOB 快 ~2 倍 | pureXML 快 ~1.75 倍 |
| 併發插入 | pureXML 快 2~2.5 倍 | pureXML 快 2.5~5 倍 |
| 複雜查詢 | pureXML 快 7~44 倍 | pureXML 快 50~100 倍 |
| 簡單查詢 | 視快取而定 | SQL/XML 可能更快 |
典型業務「一次插入、多次查詢」強烈傾向 pureXML。應用仍需在插入/查詢效能間權衡,混合策略或為最佳。所有結果基於隔離實驗室環境,實際部署請自行基準測試。