首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> DB2 資料庫 >> DB2 教學

DB2 pureXML 索引設計精要與命名空間處理實戰(第四部分)

     編輯:DB2 教學

XML 索引定義的核心原則

DB2 支持路徑專用 XML 索引,僅對謂詞與連接高頻出現的元素/屬性建立索引。例如針對定期存款本金金額:

create index tdpa on trades(tradedoc) generate keys
using XMLpattern '/FpML/trade/termDeposit/principal/amount' as sql double;

索引鍵隨文檔增刪改自動維護。權衡點:索引佔用空間、維護開銷與查詢收益成正比,鍵值數量等於文檔中匹配 XPath 的節點數。

最佳實踐:拒絕模糊路徑,擁抱完全指定路徑

為外匯交易支付金額建立索引,若使用 //paymentAmount/amount 這類雙斜線通配符:

  • 索引掃描需遍歷全文檔樹,CPU 開銷大
  • 可能誤納入非預期路徑節點,導致索引膨脹

正解:精確指定路徑 /FpML/trade/fxSingleLeg/*/paymentAmount/amount,兼顧精準與通配靈活性。

索引數據類型必須與查詢謂詞精準匹配

DB2 提供 5 種 XML 索引類型:DOUBLE、VARCHAR(n)、VARCHAR HASHED、DATE、TIMESTAMP。類型不匹配索引失效:

  • 數值謂詞加引號("510026")被視為字符串,DOUBLE 索引無法使用 → 改用 VARCHAR 索引或去除引號
  • 日期字面量 "2002-02-14Z" 匹配 VARCHAR 而非 DATE 索引 → 查詢中轉型 xs:date("2002-02-14Z")

字符串索引選型表:

索引類型適用謂詞長度限制典型場景
VARCHAR(n)範圍、等值、排序N 字節短字符串、需範圍查詢
VARCHAR HASHED僅等值無限制長字符串、純等值過濾

經驗法則:純等值查詢優先 VARCHAR HASHED,特別是長文本;需範圍/排序則用 VARCHAR(n)。

/text() 在索引與查詢中的一致性要求

葉子元素值等同於其文本節點,謂詞加不加 /text() 結果相同,但索引定義必須與查詢完全一致:

  • 查詢用 currency = "EUR" → 索引定義 /FpML/.../currency
  • 查詢用 currency/text() = "EUR" → 索引定義 /FpML/.../currency/text()

非葉子節點(如 <principal> 包含 currency+amount)其值為所有後代文本串聯(EUR25000000.00),極少建議對非葉子節點建索引,除非極其確定結構穩定且查詢確需前綴匹配。

讓 XML 索引真正被查詢使用

容量覆蓋原則

索引路徑必須包含查詢謂詞路徑的所有節點。查詢用通配符 FpML//currency 範圍超過索引 /FpML/trade/fxSingleLeg//currency 時,索引失效。建議:查詢盡量避免 //,使用完整路徑。

XML 連接查詢必須顯式轉型

連接謂詞無固有類型,DB2 無法確定索引適用性。解決方案:在連接鍵上強制轉型:

where $tdoc/party/partyId/xs:double(.) = $pdoc/PtyID/xs:double(.)

索引類型與轉型函數對照:

索引 SQL 類型轉型函數
DOUBLExs:double()
VARCHAR(n)/HASHEDfn:string()
DATExs:date()
TIMESTAMPxs:dateTime()

XML 命名空間:從文檔到索引的完整處理鏈路

文檔聲明與查詢適配

FpML 文檔常聲明默認命名空間 xmlns="https://www.fpml.org/2007/FpML-4-3"。無命名空間查詢無法匹配帶命名空間文檔。三種應對策略:

  1. 通配符前綴:*:FpML/*:trade/*:tradeDate —— 兼容有/無命名空間,但語義鬆散
  2. 默認元素命名空間:XMLNAMESPACES(DEFAULT 'uri') —— 單一命名空間場景首選
  3. 顯式前綴聲明:declare namespace fpml="uri"; $TRADEDOC/fpml:FpML/... —— 多命名空間混合場景最精準

索引定義必須同步命名空間

無命名空間索引無法覆蓋帶命名空間文檔。兩種等效寫法:

-- 方式 1:顯式前綴
create index thtdns1 on trades(tradedoc) generate keys using XMLpattern
'declare namespace fpml="https://www.fpml.org/2007/FpML-4-3";
 /fpml:FpML/fpml:trade/fpml:tradeHeader/fpml:tradeDate' as sql date;

-- 方式 2:默認元素命名空間
create index thtdns2 on trades(tradedoc) generate keys using XMLpattern
'declare default element namespace "https://www.fpml.org/2007/FpML-4-3";
 /FpML/trade/tradeHeader/tradeDate' as sql date;

若需同時覆蓋帶/不帶命名空間文檔,使用命名空間通配符:

create index thtdns3 on trades(tradedoc) generate keys using
XMLpattern '/*:FpML/*:trade/*:tradeHeader/*:tradeDate' as sql date;

此索引符合「容量覆蓋」原則,可服務於顯式前綴查詢。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved