DB2 9 引入了 pureXML 支持,這意味著 XML 數(shù)據(jù)是以其自身固有的分層格式進(jìn)行存儲(chǔ)和查詢的。為了查詢 XML 數(shù)據(jù),DB2 提供了兩種語言:SQL/XML 和 XQuery。
您可以單獨(dú)使用 xquery 和 sql,但也可將 xquery 嵌入 sql 中使用(反之亦可)。每一種可選方案在特定環(huán)境下都非常有用。本文將討論這些可選方案,介紹其各自的優(yōu)缺點(diǎn),并給出根據(jù)您的需求選擇恰當(dāng)方案的指導(dǎo)原則。
DB2 中的 pureXML 支持為管理 XML 數(shù)據(jù)提供了高效且通用的功能。DB2 以 XML 數(shù)據(jù)自身固有的分層格式存儲(chǔ)和處理這些數(shù)據(jù),避免因?yàn)閷?XML 存儲(chǔ)為 CLOB 中的文本或?qū)⑺成錇殛P(guān)系表而導(dǎo)致的性能和靈活性限制。與僅使用 XML 的不同,DB2 V9 還提供了關(guān)系型數(shù)據(jù)與 XML 數(shù)據(jù)在中的無縫集成 —— 甚至是表的某一行中的集成。這樣的靈活性表現(xiàn)在語言支持中,使您可訪問關(guān)系型數(shù)據(jù)、XML 數(shù)據(jù),或者同時(shí)訪問這兩種數(shù)據(jù)。您可以通過以下四種可選方案中的任一種查詢 XML:
- 普通 SQL(不包含 XQuery)
- SQL/XML,即嵌入了 XQuery 的 SQL
- XQuery 作為獨(dú)立語言(不包含 SQL)
- 嵌入了 SQL 的 XQuery
本文假設(shè)您已經(jīng)熟悉這兩篇文章中介紹的基本概念。請(qǐng)注意,XPath 是 XQuery 的一種子語言,因此我們提到 XQuery 時(shí),也暗中包含 XPath 語言。如果您使用過 DB2 XML Extender 中的 XSLT 樣式表或位置路徑,那么您應(yīng)該已經(jīng)了解 XPath。在很多時(shí)候,使用 XPath 足以提取 XML 值或表示 XML 謂詞,因此,即便您還不熟悉 XQuery 的所有其他特性,也可以開始使用 XPath。
DB2 使您能夠利用所有這些可選方案最大限度地提高生產(chǎn)力、使查詢適應(yīng)應(yīng)用程序的需求。本文將說明的問題如下:
- 這四種可選方案的關(guān)鍵特征是什么?各有哪些優(yōu)缺點(diǎn)?
- 您應(yīng)該在哪種情況下選擇哪種方案?
讓我們先給出一個(gè)高度總結(jié),然后再詳細(xì)研究各個(gè)可選方案的細(xì)節(jié)和特定實(shí)例。
總結(jié)與指導(dǎo)原則
您可以在普通 XQuery、SQL/XML 或具有內(nèi)置 SQL 的 XQuery 中表達(dá)許多查詢。在特定情況下,您可能會(huì)發(fā)現(xiàn)其中之一能夠比其他方案更為直觀地表達(dá)您的查詢邏輯。一般而言,查詢 XML 的 “正確” 途徑需要在 “逐個(gè)處理” 的基礎(chǔ)上加以選擇,需要考慮應(yīng)用程序的具體需求和特征。但我們可總結(jié)出以下指導(dǎo)原則。
- 不帶任何 XQuery 或 XPath 的普通 SQL 僅對(duì)全文檔檢索以及整個(gè)文檔的插入、刪除、更新操作有用。文檔的選擇必須基于同一表中的非 XML 列。
- 帶有嵌入在 SQL 內(nèi)的 XQuery 或 XPath 語句的 SQL/XML 提供了最廣泛的功能性和最少的局限性。您可在 XML 列上表示謂詞、提取文檔片段、向 XQuery 表達(dá)式傳遞參數(shù)標(biāo)記、使用全文本搜索、SQL 級(jí)聚集與分組,您還可以用一種靈活的方式將關(guān)系型數(shù)據(jù)與 XML 數(shù)據(jù)進(jìn)行聯(lián)合和連接。這種方案可很好地服務(wù)于絕大多數(shù)應(yīng)用程序。即便您不是立即需要利用所有這些優(yōu)勢(shì),可能仍然會(huì)考慮選擇這種方案,從而使您的選擇能夠應(yīng)對(duì)未來的擴(kuò)展。
- XQuery 是一種強(qiáng)大的查詢語言,專為查詢 XML 數(shù)據(jù)而設(shè)計(jì)。同樣,如果您的應(yīng)用程序只需查詢和操縱 XML 數(shù)據(jù),且不涉及任何關(guān)系型數(shù)據(jù),那么 XQuery 也是一種極為出色的選擇方案。此方案有時(shí)可能較為簡單直觀。此外,如果您正從一個(gè)僅使用 XML 的數(shù)據(jù)庫移植到 DB2 9,且已有 XQuery,那么您很可能愿意繼續(xù)使用 XQuery。
- 嵌入了 SQL 的 XQuery 在您希望利用關(guān)系型謂詞和索引同時(shí)又想利用全文本搜索預(yù)先過濾隨后將作為 XQuery 輸入的 XML 列中的文檔時(shí)不失為明智之選。嵌入在 XQuery 中的 SQL 允許您在 XML 列上運(yùn)行外部函數(shù)。但若您需要執(zhí)行帶有分組和聚集的數(shù)據(jù)分析查詢,那么 SQL/XML 是更好的選擇。
無論您選擇在一條語句中怎樣結(jié)合 SQL 和 XQuery,DB2 都使用一種混合編譯器來為整個(gè)查詢生成及優(yōu)化一種執(zhí)行規(guī)劃 —— 不會(huì)導(dǎo)致查詢執(zhí)行的性能損失。
下表總結(jié)了查詢 XML 數(shù)據(jù)的四種不同可選方案的各自優(yōu)點(diǎn)。
表 1. 總結(jié)
? | 普通 SQL | SQL/XML | 普通 XQuery | 嵌入了 SQL/XML 的 XQuery |
---|---|---|---|---|
XML 謂詞 | – | ++ | ++ | ++ |
關(guān)系謂詞 | ++ | ++ | – | + |
XML 及關(guān)系謂詞 | – | ++ | – | ++ |
將 XML 與關(guān)系型相連接 | – | ++ | – | ++ |
將 XML 與 XML 相連接 | – | + | ++ | ++ |
轉(zhuǎn)換 XML 數(shù)據(jù) | – | o | ++ | ++ |
插入、更新和刪除 | ++ | ++ | – | – |
參數(shù)標(biāo)記 | + | ++ | – | – |
全文本搜索 | + | ++ | – | ++ |
XML 聚集與分組 | – | ++ | o | o |
函數(shù)調(diào)用 | ++ | ++ | – | ++ |
在上表中,“-” 表示給定語言不支持某項(xiàng)特性;“+” 表示支持此特性,但存在更有效或更便捷的方式;“++” 表示給定語言極為適合表現(xiàn)該特性;最后,“o” 表示盡管可表現(xiàn)此特性,但從某種程度上來說,效果非常糟糕或者效率很低。
現(xiàn)在,讓我們來定義一些示例數(shù)據(jù)和表,以查看具體的查詢示例。