DB2 9 XML 索引不同於關係索引:它不索引整列值,而是針對 XML 文檔內部特定 XPath 路徑提取節點值 (文本、屬性、元素) 建立 B+ 樹索引鍵。每個索引條目包含:文檔標識 (DOCID)、節點路徑標識、提取的鍵值。查詢時優化器將 XPath 謂詞匹配到索引定義,實現索引掃描替代全表掃描+XML 解析。
CREATE INDEX idx_products_spec_cpu ON products(details) GENERATE KEY USING XMLPATTERN '/product/spec/cpu' AS SQL VARCHAR(50);
GENERATE KEY USING XMLPATTERN:指定 XPath 子集 (支持 /, //, @, *, text(), 位置謂詞 [1])。AS SQL type:鍵值 SQL 類型 (VARCHAR, INTEGER, DECIMAL, DATE, TIMESTAMP 等),決定比較語義與排序。INCLUDE 非鍵列 (僅關係列),COMPRESS YES 啟用索引壓縮。| 索引模式 | XPath 示例 | 適用查詢 | 備註 |
|---|---|---|---|
| 單值標量索引 | /order/@id, /order/customer/name | 等值、範圍、排序、分組 | 最常用,鍵值為單一原子值 |
| 多值索引 (節點序列) | /order/items/item/sku | 存在性檢查 (XMLEXISTS)、JOIN (XMLTABLE) | 一行文檔產生多個索引條目,佔用空間大 |
| 路徑存在性索引 | /order/optional_field | XMLEXISTS('/order/optional_field') | 不提取值,僅記錄路徑是否存在,極小 |
| 全文搜索索引 | Text Search 索引 (非 XML 索引) | CONTAINS, SCORE | 單獨創建,支持語幹、模糊、評分 |
db2pd -db dbname -indexes 查看 XML 索引大小、頁面分裂、葉頁密度。RUNSTATS ... COLLECT XML COLUMN STATISTICS 定期更新 (建議每日/每周視數據變更率)。REORG INDEXES ALL FOR TABLE ... ALLOW READ ACCESS 整理碎片,回收空間,提升掃描速度。| 現象 | 可能原因 | 排查步驟 |
|---|---|---|
| 查詢未使用 XML 索引 | 統計信息缺失、類型不匹配、XPath 不兼容、優化器成本估算偏向表掃描 | 1. RUNSTATS 2. EXPLAIN 分析謂詞匹配 3. 強制索引 OPTIMIZATION PROFILE |
| 寫入性能急劇下降 | XML 索引過多、大文檔更新頻繁、索引鍵值長 (VARCHAR(1000+)) | 精簡索引、縮短鍵長度、考慮異步索引維護 (DB2 11.1+) |
| 索引空間暴增 | 多值索引產生大量條目、文檔結構變化導致舊條目殘留 | REORG、評估是否改用路徑存在性索引 |
DB2 9 XML 索引是釋放 pureXML 查詢性能的關鍵。通過精準的 XPath 模式選擇、合適的 SQL 類型映射、統計信息維護、寫入開銷平衡,可實現亞秒級 XML 節點檢索,支撐高並發 XML 應用。