技术开发 频道

DB2 Version 9.5 pureXML的增强和新特性

【IT168技术文档】

本文描述 IBM® DB2® V9.5 版针对 Linux、Unix 和 Windows 的 pureXML™ 增强和新特性。DB2 Version 9 支持将 XML 作为原生数据类型,也支持 SQL/XML、XQuery 语言,以及其他诸如模式支持、发布函数、对实用工具的 XML 支持、分解等特性。DB2 V9.5 增强了其中的一些特性并引入了新特性,以更加高效地处理 XML。本文从如何使 XML 处理更高效和更易于使用的角度解释了这些增强和新特性。

DB2 9 XML 支持概述

DB2 9 引入了原生 XML 数据类型。它将 XML 存储为一种经过解析的分层(原生)格式,并允许用户使用 XQuery 和 SQL/XML 语言查询数据。DB2 XQuery 表达式将存储在 DB2 数据库中的 XML 文档用作 XML 的查询源。函数 xmlcolumn 和 sqlquery 用来连接存储在数据库中的 XML 值,并为 XQuery 解析器提供 XML 序列。

除了 XQuery 语言,DB2 9 还提供了 SQL/XML 函数在单个查询中同时处理 XML 数据和关系数据。SQL/XML 函数 xmlquery、xmltable 和 xmlexists 有助于将 XQuery 嵌入到 SQL 语句中。

DB2 9 还支持模式验证。它引入了新的命令和存储过程,用于将模式注册到数据库并充当数据库对象。在插入操作之前或之后,可以用 xmlvalidate 函数根据已注册的模式验证 XML 值。也可以对模式进行注释,以便于将 XML 数据分解为关系表。 诸如 xmlelement、xmlattributes 等发布函数可用来将关系值转换为 XML 文档。DB2 9 也针对 XML 数据支持对一些实用工具(导入、导出等等)进行了更新。更多关于 Version 9 中的 XML 支持请参见 参考资料 部分。

DB2 V9.5 的新特性

在处理 XML 数据方面,现有的 DB2 9 功能非常强大。DB2 V9.5 增强了一些现有特性并引入了其他功能,以使 XML 处理更加强大和高效。下面是本文将要讨论的功能列表:

◆支持在非 Unicode 数据库中使用 XML

◆子文档更新

◆基础表存储/压缩

◆兼容的 XML 模式演化

◆验证触发器

◆验证检查约束

◆XML 复制

◆XML 联合

◆XML 载入

◆sqlquery() 参数

◆用户友好的发布函数

◆SQL/XML 函数的默认参数传递

◆XSLT 函数

◆XML 分解增强

◆XML 索引增强

◆索引顾问程序(Index advisor)和优化器增强

◆DB2 Data Web 服务

以下小节的大多数代码示例都基于 DB2 V9.5 示例数据库。可以从 DB2 V9.5 命令行处理器运行 db2sampl 命令来创建示例数据库。也可以通过 first step 来创建。first step 是 DB2 提供的一个工具,在安装了 DB2 之后就会执行,也可以在以后通过在 Windows 中选择 Start > All Programs > IBM DB2 > db2 copy name > Set up tools > first steps 来执行。

支持在非 Unicode 数据库中使用 XML

DB2 9 只允许用户使用 UTF-8 代码页创建包含 XML 数据的数据库。这意味着,即使 XML 文档中的值是 ASCII 格式的,也需要存储到 UTF-8 格式的数据库中。DB2 V9.5 去掉了这个限制,并且允许用户用任意代码集创建包含 XML 列的数据库。由于去掉了这个限制,即使数据库不是用 UTF-8 格式创建的,用户也可以更改一个表以添加 XML 列,或者创建一个包含 XML 列的新表。

以下代码创建了一个示例数据库和包含一个 XML 列的示例表:

 清单1. 使用默认代码页的数据库

db2 CREATE DATABASE sampledb
            db2 CONNECT TO sampledb
            db2 CREATE TABLE record(id INT, record XML)
            子文档更新
       DB2 V9.5 允许用户更新存储在数据库中的 XML 文档的一部分。它引入了 XQuery transform 表达式,该表达式使用 4 个更新表达式 —— insert、delete、replace 和 rename 来修改 XML 文档片段。transform 表达式是 XQuery 语言的一部分,因此可以用在 XQuery 表达式中。对于 DB2 V9.5,一个 transform 表达式中只能使用一个更新表达式。一个 transform 表达式有以下子句:

◆COPY:transform 表达式的 copy 子句 将源 XML 值绑定到一个变量。更新表达式将会在查询中对该副本进行处理。

◆MODIFY:modify 子句 根据更新表达式修改复制的 XML 值。在 MODIFY 子句中可以使用多个更新表达式。

◆return:return 子句 返回修改后的值。

下面将解释这 4 个更新表达式:

1.insert 表达式 将一个新的 XML 节点插入到现有 XML 文档中。可以在 XML 文档指定插入的位置。

2.replace 表达式 用来更新特定节点的特定值。

3.delete 表达式 用来从 XML 文档删除特定节点。

4.rename 表达式 用来对节点进行重命名。

由于 transform 表达式是 XQuery 语言的一部分,因此可以在包含 xmlquery 函数的 SQL 语句中使用它,也可以用于更新语句来更新 XML 值。

清单 2 中的代码更新了示例数据库中 customer 表的 info 列。它更新 XML 文档以使用 cid 关系列的值匹配 CID 属性。

 清单2.更新表的 transform 表达式

UPDATE CUSTOMER
            SET info =
            XMLQUERY('transform
            copy  $po := $INFO
            modify
            do replace value of $po/customerinfo/@Cid  with $CID
            return  $po'
            passing info as "INFO", cid as "CID")
            WHERE cid=1000

如果在表的 XML 列上存在 XML 验证检查约束,在手动更新或者通过触发器更新之前,用户可能需要验证新的 XML 值。

以下代码示例从 purchaseorder 表中删除一个条目,并将修改后的文档作为查询结果。

 清单3. transform 表达式

xquery
            transform
            copy
            $po := db2-fn:sqlquery(‘select porder from purchaseorder where
            custid = 1002 and orderdate=“2006-02-18”’)
            modify
            do  delete $po/ PurchaseOrder/item[partid = “100-201-01”]
            return  $po

示例 xupdate.db2 给出了 transform 表达式的不同例子。可以在 sqllib/samples/xml/xquery/clp 目录下找到此示例。

基础表行存储/压缩  

在 DB2 9 中,XML 数据和关系数据存储在不同的位置。这个存储位置称作 XML 数据区域(XML data area,XDA)。DB2 9 将所有 XML 文档存储在这个存储位置,这意味着访问 XML 值和关系数据需要更多 I/O。如果 XML 文档较小,而且在存储关系值之后页面大小仍足够容纳 XML 值,那么将 XML 存储在相同的页面能够提供不错的性能收益。这些收益包括:

压缩:因为 XML 数据和关系数据存储在一起,因此可以使用 DB2 9 中引入的压缩技术对 XML 数据进行压缩。由于 XML 值比关系数据大,所以可以获得较高程度的压缩。

查询性能:由于 XML 数据和关系数据存储在相同位置,因此直接插入 XML 数据使得基础表比一般情况下要大。如果 XML 数据的访问频率与表中的其他关系值相当,那么这将提高查询数据的性能。

DB2 V9.5 引入了 XML 数据的基础表行存储。这意味着如果每行的关系数据和 XML 数据的总大小没有超过 1 页面的大小,这两种数据就可以存储在相同的物理页面。只有当一个记录的总大小没有超过页面大小时,才能够对 XML 数据进行基础表行存储。如果是这样,XML 数据就会像通常一样存储在 XML 存储位置。DB2 中允许的页面最大值为 32 KB,因此一个 XML 值的最大插入长度也被限制到 32 KB。如果文档的内部树表示的大小比指定的插入长度小,它们将会被插入。清单 4 中的代码所创建的表可以对 XML 数据进行基础表行存储:

 清单4.XML 数据的基础表存储 

db2 CREATE TABLE emp1(id INT, info XML INLINE LENGTH 1024)

使用 INLINE 选项指定将 XML 数据跟关系数据存储在一起。这对于要获取的数据都位于相同位置的查询来说很有利。另一方面,对于访问非 XML 数据的查询,这可能导致需要更多的 I/O 才能找到关系数据。

0
相关文章