纯 XML
现有的关系数据服务器将 XML 文档存储为字符或二进制大对象(CLOB 或 BLOB)。但是,在 CLOB 或 BLOB 中,数据存储为单一的单元或连续的字节串。当查询 XML 文档中的特定值或者更新 XML 文档的一部分时,这种存储格式会造成性能难题。必须读取整个记录并进行解析,然后才能进行谓词评估。建立索引可以降低搜索成本;但是,对 XML 文档的更新要求更新 XML 索引。对 XML 文档的更新还需要重写整个文档。
对 XML 文档进行分解(Shredding 或 decomposing)是另一种 RDBMS 存储方法。通过将 XML 文档的每个元素映射到一个关系列,XML 文档可以存储在多个表和列中。文档被分解之后,结构和任何相关联的条目(比如数字签名)就丢失了;但是,在不需要保留整个 XML 文档时,分解是一种值得考虑的解决方案。
DB2 Viper 将最纯粹形式的 XML 保存为经过预解析的带注解的树。当今的市场上有纯 XML 数据库;但是,它们不是混合型数据库(这意味着它们不能同时提供 XML 数据和关系数据的优势)。有了 DB2 Viper,XML 就可以存储为层次化的基于节点的模型,在这种模型中每个节点不只与它的父节点链接,而且与它的子节点链接。这种纯 XML 存储是最高效的访问和存储整个 XML 文档的方法,有很大的性能优势。
纯 XML 存储通过按照原样存储 XML 文档提供了 BLOB 和 CLOB 的优点,同时解决了性能问题,因为文档存储不虚拟化成单个连续的字节范围。整组文档的存储虚拟化为一个连续的字节范围,但是可以在这个范围中重新定位各个节点,这样就最小化了对其他节点和索引的影响。
DB2 Viper 支持分解的 XML 和纯 XML 两种方式。支持分解很重要,因为 XML 可以用来填充现有的关系模式。因为文档会增大并可以在许多情况下更新,XML 文档的非 BLOB 存储(包括以节点级粒度进行存储)的优势很显著。
大多数公司有关系数据服务器,而且已经有专门的人员来支持它们。尽管 Viper 提供了新的高级的 XML 技术,但是公司不需要雇佣新的理解 XML 的开发人员。为了创建 DB2 混合型表(同时包含关系数据和 XML 数据的表),只需一个简单的 CREATE TABLE 语句和新的 XML 数据类型:
清单 1. 创建包含 XML 列的表
create table clients(
id int primary key not null,
name varchar(50),
status varchar(10),
contactinfo xml
)
为了访问混合型表,IBM 支持对 SQL 的工业标准扩展,即 SQL/XML。这些扩展允许只用简单的 SELECT 语句来检索 XML 文档或 XML 文档的一部分。除了 SQL/XML 之外,DB2 还支持新的 XML Query(即 XQuery)语言。XQuery 是一种由 World Wide Web Consortium(W3C)推动的标准,设计它是为了查询 XML 的层次化结构,正如设计 SQL 是为了查询表格数据结构一样。XQuery 与 SQL 的不同之处是它能够提供路径表达式,使程序员能够在 XML 的层次化结构中导航。下面这个简单的 XQuery 示例返回客户的联系数据:
清单 2. XQuery 语句
xquery db2-fn:xmlcolumn('CLIENTS.CONTACTINFO')
假设希望检索所有提供了传真号码的客户的传真号码,那么可以编写下面这样的查询:
清单 3. 检索所有提供了传真号码的客户的传真号码
xquery
for $y in db2-fn:xmlcolumn('CLIENTS.CONTACTINFO')/Client/fax
return $y
第一行让 DB2 调用它的 XQuery 解析器。下一行让 DB2 遍历 CLIENTS.CONTACTINFO 列中 Client 元素的 fax 子元素。每个 fax 元素被绑定到变量 $y。第三行要求对于每次迭代返回 $y 的值。结果就是下面的 XML 元素序列:
清单 4. XML 元素序列结果
<fax>4081112222</fax>
<fax>5559998888</fax>
DB2 直接支持 XQuery 语言,这意味着它无需将 XQuery 转换为 SQL(转换会引入不必要的开销以及语义的不一致)。而且它不要求客户将 XQuery 语句包装在 SQL 语句中。DB2 客户可以按照自己的希望利用 XQuery 和 SQL;甚至可以使用 “双语” 查询,也就是在同一个查询中同时利用这两种语言的独特功能。新的高级 XML 索引技术补充了 Viper 对 SQL/XML 和 XQuery 的支持,能够提供很好的运行时性能。
关于混合型 DB2/XML 引擎的更多信息,请参考 DB2mag.com 上的 “Firing up the Hybrid Engine” Quarter 3, 2005。