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