用新的 DB2 V9.7 pureXML 特性增强 XML 数据的业务洞察力和可伸缩性

IBM DB2® for Linux®, UNIX®, and Windows®, Version 9.7(2009 年 4 月 22 日发布)为 pureXML 提供新的数据库设计、管理和开发特性。了解这些技术如何帮助公司更有效地把 XML 数据集成到业务智能化环境中,以及公司如何应对不断增长的 XML 数据量。本文总结新的 pureXML 功能,解释如何使用它们,讨论示例应用场景。

Cynthia M. Saracco, 高级解决方案架构师

照片:Cynthia SaraccoCynthia M. Saracco 是 IBM 硅谷实验室的高级解决方案架构师,擅长新兴技术和数据库管理主题。她有 23 年软件行业从业经验,曾经撰写了三本书和 60 多篇技术文章,拥有七项专利。


developerWorks 专家作者

Matthias Nicola, 高级软件工程师, IBM 硅谷实验室

作者照片:Matthias NicolaNicola 博士是 IBM 硅谷实验室 XML 数据库性能方面的技术负责人。他的工作重点是 DB2 中 XML 性能的所有方面,包括 XQuery、SQL/XML 以及 DB2 中的所有原生 XML 特性。Nicola 博士与客户和业务合作伙伴紧密协作,协助他们设计、实现和优化 XML 解决方案。在加入 IBM 之前,Nicola 博士曾在 Informix Software 公司从事数据仓库性能方面的工作。他还曾经从事分布式复制数据库的研究和工业项目四年时间。他于 1999 年从德国 Technical University of Aachen 获得了计算机科学博士学位。



2009 年 5 月 25 日

简介

IBM 为社区提供了 DB2 免费版本 DB2 Express-C,它提供了与 DB2 Express Edition 相同的核心数据特性,为构建和部署应用程序奠定了坚实的基础。

许多组织力求创建灵活可靠的 IT 环境,从而更好地洞察力关键业务操作,这要求核心信息管理系统能够适应不断变化的业务需求。为了帮助公司解决这个难题,IBM 在几个重要方面改进了 DB2 9.7 的 pureXML 特性。

DB2 9.7 中的新特性提供针对 XML 数据的新的数据库设计选项,包括散列分区(数据库分区)、范围分区(表分区)和多维聚簇。这些选项可以帮助公司应对巨大的数据量,实现并行处理环境,简化时间敏感数据的添加或删除,提高许多查询的性能。通过单独或结合使用这些 DB2 设计选项,公司可以把 XML 数据集成到关系数据仓库中;为 XML 消息、文档和数据 feed 创建操作性数据存储;提高 XML 事务处理工作负载的可伸缩性。

这些新的数据库设计选项只是 DB2 9.7 提供的 pureXML 改进的一部分。本文介绍这些选项和其他新的 pureXML 功能,解释它们对哪些场景最有帮助,提供帮助您入门的提示。本文讨论以下主题:

DB2 pureXML 概述

从 2006 年开始,DB2 9 为表和 XML 层次结构中建模的数据提供一种通用的应用程序编程接口和数据库管理平台。这种混合型数据库管理体系结构(见图 1)让公司能够扩展传统的关系数据库环境,直接管理 XML 消息和文档,而不需要把数据分解 或映射到多个表的多个列(由此把 XML 转换为传统的 SQL 数据类型)。XML 数据可以按照原有的层次化格式与关系数据一起存储。应用程序可以轻松高效地获取 XML 数据的相关部分。应用程序还可以简便地集成 XML 数据和关系数据。

图 1. 支持关系和 XML 数据的 DB2 9 体系结构
支持关系和 XML 数据的 DB2 9 体系结构

为了使用 DB2 pureXML 功能,管理员必须创建 XML 类型的一个或多个列。XML 索引、查询优化、存储管理和其他 DB2 服务有助于确保出色的效率和运行时性能。

清单 1 说明在 DB2 中使用 XML 数据是多么容易。清单 1 中的代码执行以下任务:

  1. 创建一个包含关系列和 XML 列的表
  2. 为 XML 列的特定部分编制索引
  3. 把数据插入表中
  4. 执行查询(使用简单的 SQL、SQL/XML 和 XQuery)
  5. 更新 XML 文档中存储的 XML 元素的值
清单 1. 使用 DB2 pureXML
-- Create a table with an integer and an XML column
CREATE TABLE customer (cid INTEGER, info XML);

-- Create an XML index for customer zip code data 
CREATE INDEX idx1 ON customer(info) GENERATE KEYS USING 
XMLPATTERN '/customerinfo/addr/zip' AS SQL VARCHAR(5);

-- Populate the table with data using a simple INSERT statement 
INSERT INTO customer (cid, info) VALUES (?,?);

-- Retrieve relational data and full XML documents 
-- for customers using simple SQL  
SELECT cid, info
FROM customer 
WHERE cid > 1234;

-- Retrieve names of customers in a specific zip code 
-- who have an ID of > 1234 using SQL/XML
SELECT XMLQUERY('$INFO/customer/name')
FROM customer 
WHERE cid > 1234 and 
XMLEXISTS('$INFO/customer/addr[zip = 95123]');

-- Retrieve an XML element that lists the names of customers
-- in a given zip code using XQuery
xquery for $i in db2-fn:xmlcolumn("CUSTOMER.INFO")/customer
where $i/addr/zip = 95123
return <myresult>{$i/name}</myresult> ;

-- Update XML element value related to zip code 
UPDATE customer
SET INFO = XMLQUERY('copy $new := $INFO
            modify do replace value of $new/customer/addr/zip 
                       with 95141
            return  $new') 
WHERE ...;

示例用例

面向服务体系结构 (SOA)、以 Web 为中心的应用程序和基于行业标准的集成项目常常依靠 XML 定义如何表示和交换重要的业务数据。另外,审计和遵从性活动常常要求在特定时间段内保留各种业务事务的完整记录。XML 的广泛使用促使许多公司评估自己的数据库如何应对大量 XML 消息和文档中复杂的高度可变的结构。XML 数据管理对面向事务环境和分析应用程序都有影响。

集成操作性数据

XML 具有灵活性和自我描述能力,这使它很适合表示各种业务工件。这种工件常常存储在现有的关系数据库管理系统或文件系统中,或者由 Web 服务、实时数据 feed 或其他软件动态地生成工件。处理和分析来自这些数据源的信息有一定的难度。公司可以通过维护共享的基于 XML 的存储库获益。XML 结构的可变性使 XML 能够适应各种业务需求。基于 XML 的操作性数据存储 (ODS) 可以降低应用程序开发成本,提供敏捷的基础结构,能够适应数据管理需求的变化。

图 2 给出一个示例体系结构,其中使用 DB2 的 pureXML 技术作为操作性数据存储,代表各种业务应用程序集成来自多个数据源的数据。比较新的数据源和应用程序甚至可能不需要 XML 适配器,因为它们可能使用 XML 作为主要数据交换格式。

图 2. DB2 pureXML 作为集成的操作性数据存储
DB2 pureXML 作为集成的操作性数据存储

扩展数据仓库

自从数据仓库在 20 世纪 90 年代出现以来,数据仓库在帮助公司分析趋势和改进业务战略方面的作用越来越重要了。尽管关系数据库管理技术仍然适用于数据仓库,但是添加 XML 数据管理功能可以显著提高灵活性,让公司能够满足不断变化的业务报告和分析需求,而不需要对数据库模式做重大修改,也不需要重写现有的应用程序代码。

例如,请考虑一个跟踪销售信息的数据仓库。按照典型的星型数据库设计,一个事实 表包含按产品、地区和时间段排序的销售数据。这个事实表中的数据通常与多个 表中的数据联结,从而获取关于各个产品、地区等的特定信息。但糟糕的是,为这种数据仓库开发详细的数据库设计是很困难的。

请考虑一下,如果必须表示不同范围的产品,那么设计适当的产品维表会有哪些困难。不同类型的产品有不同的属性,所以很难预先决定哪些产品应该向业务分析师和执行官提供哪些属性。分析师常常需要以出乎意外的方式对产品销售数据进行向下钻取或分片,比如按照尺码、颜色、质地、领口、袖子长度等研究女式毛线衫的销售。在纯粹的关系设计中,每个产品的可能感兴趣的每个属性都需要捕捉到自己的列中,这会产生巨大的非常笨拙的维表。因为产品的属性各不相同,这种表有许多行,但是填充的列非常稀疏,这导致效率非常低。另外,随着时间的推移会出现新的产品和新的产品属性,就需要修改数据库模式(以及依赖于它的所有应用程序),这会导致很高的成本。在公司数据仓库中的一个表中添加一列,需要经过许多 IT 组织长时间的审查和批准过程。

对于适应业务需求的变化,一种破坏性比较低的方法是在数据仓库模式中使用一个或多个 XML 列。通用的属性仍然可以放在关系列中,而在 XML 列中维护其他详细信息,XML 文档很容易提供可变的结构,很容易进行查询和报告。对于上述示例,可以在包含产品数据的维表中使用一个 XML 列。对于需要跟踪的新的产品属性,只需把它们作为新元素包含在与目标产品相关联的 XML 文档中。不需要修改数据库模式。

图 3 说明用 XML 扩展数据仓库的一种方法。

图 3. 具有 XML 数据管理功能的关系数据仓库。事实表和所有维表都可以包含 XML 列,但是这个示例只给出一个包含 XML 列的维表
具有 XML 数据管理功能的关系数据仓库。 事实表和所有维表都可以包含 XML 列, 但是这个示例只给出一个包含 XML 列的维表

在图 3 中,一个操作性数据存储定期向数据仓库提供新信息。其中一些信息可能是 XML,其他信息是关系数据。尽管图 3 只给出了维表(这个表用于跟踪各种产品的详细信息)中的 XML 数据,但是可以根据需要在维表或事实表中添加 XML 列。

支持以 XML 为中心的应用程序

尽管 DB2 pureXML 技术可以帮助许多决策支持和分析数据库,但是许多面向服务体系结构会为事务处理应用程序生成 XML 消息和文档,pureXML 技术也适合帮助公司管理日益增加的 XML 消息和文档。电子表单和 Web 服务的广泛应用只是造成 XML 数据量增加的众多因素之一。

DB2 让公司不再需要把 XML 分解存储到多个表的多个列中,这有助于处理日益增加的 XML 数据量。以原有的层次化格式存储 XML,允许通过符合行业标准的 XPath、XQuery 和 SQL/XML 表达式直接访问 XML,这可以降低管理成本和简化应用程序开发。


使用散列(数据库)分区实现最出色的可伸缩性

随着数据量的增加,跨多个处理器和存储设备分布数据库内容有助于实现线性的可伸缩性。DB2 9.7 扩展了 DB2 数据库分区特性 (DPF),支持 XML 和关系数据。以前,DPF 只支持关系数据。

图 4. 采用基于散列的分区的示例 DB2 体系结构,支持并行处理查询和其他数据库操作
采用基于散列的分区的示例 DB2 体系结构,支持并行处理查询和其他数据库操作

如图 4 所示,DPF 是一种物理数据库设计选项,它在一个多处理环境中使用多个单独的数据库分区。可以在单一 SMP(对称多处理)机器中创建多个数据库分区,也可以把它们分布在不共享任何东西 环境中的多台机器上。

DPF 对于以读操作为主的工作负载很有用,包括数据仓库环境中常见的工作负载。在使用 DPF 时,根据表的分布键(这在创建表时定义)的散列值,把表的每一行放在特定的数据库分区中。在对数据库读写数据时,DB2 自动地把工作转发到相关的分区。因此,与多个分区相关联的计算资源可以并行工作,从而满足用户的请求。随着数据量增加,可以添加新的分区,这会实现线性可伸缩性。内置管理工具 DB2 Design Advisor 可以提供分区设计建议。

为了简化 XML 数据管理和提供最出色的可伸缩性,DB2 9.7 支持跨多个数据库分区分布 XML 数据。数据分布允许自动地并行执行许多操作,包括装载、插入、查询、更新、删除、检验和发布 XML 数据。尤其是,可能长时间运行的复杂查询可以划分为多个部分并并行执行,这会显著改进响应时间。

与以前的 DB2 版本一样,一定要通过选择分布键跨分区均匀地分布行。分布键必须由关系列组成,它不能引用 XML 列。在理想情况下,这个键应该包含许多不同的值,以避免分区大小不均匀。

在 DB2 9.7 中,对 XML 数据使用 DPF 与对关系数据使用 DPF 非常相似。具体地说,管理员必须定义适当的数据库对象,比如分区组、表空间、缓冲区池等等。在创建表时,必须在 CREATE TABLE 语句中使用 DISTRIBUTE BY HASH 子句。

清单 2 创建一个 SALES 表,其中包含关系列 ORDERID、PERSONID 和 SALESDATE 以及一个用于捕捉订单详细信息的 XML 列。注意,ORDERID 列的值决定这个表中的行如何分区。

清单 2. 创建包含 XML 列的散列分区表
CREATE TABLE sales (
      orderid     INT NOT NULL,
      personid    INT, 
      salesdate   DATE,
      details     XML)  
DISTRIBUTE BY HASH (orderid)

现在,可以使用 Net Search Extender (NSE) 对散列分区表进行全文搜索。

使用范围分区随时间滚入和滚出数据

数据仓库和业务智能化环境的一项常见需求是,维护特定时间段内滚动变化的历史数据。例如,公司可能希望维护五年的滚动销售历史,让业务分析师能够评估购买模式和估计销售趋势。在这种场景中,需要每月或每季度清除或存档老数据(滚出),可能需要以相似的时间周期装载新数据(滚入)。

范围分区可以满足这个管理需求,DB2 9.7 已经改进了对这种技术的支持,可以处理 XML 数据。范围分区(有时候称为表分区)根据一列或多列中包含的值的范围划分表。通常,分区键是基于时间的,因此这种设计会把某一周、月或季度的数据存储在特定分区中。每个分区作为一个单独的数据库对象,所以管理员可以轻松地滚入(附加)新数据或滚出(分离)老数据。另外,DB2 会自动地避免访问与用户请求无关的分区中的数据,因此许多查询能够实现非常好的运行时性能。

图 5 给出一个示例 DB2 环境,它按季度对销售表中的数据进行分区。

图 5. 在范围分区环境中,DB2 只访问满足用户请求所需的分区
在范围分区环境中,DB2 只访问满足用户请求所需的分区

与管理只包含关系列的范围分区表相比,管理包含一个或多个 XML 列的范围分区表的差异并不大。尤其是,对于范围分区表,仍然可以使用以前支持的创建和修改表的 SQL 语句。另外,分区键仍然必须基于关系数据。

清单 3 创建一个包含关系和 XML 数据的范围分区表,滚出(分离)包含老数据的分区,滚入(附加)包含最近数据的分区。

清单 3. 结合使用范围分区和 DB2 pureXML
-- Create a range-partitioned table
CREATE TABLE salespart (
    orderid     INT, 
    orderdate   DATE, 
    ordermonth  INT NOT NULL GENERATED ALWAYS AS (month(orderdate)),
    orderyear   INT NOT NULL GENERATED ALWAYS AS (year(orderdate)),
    customerid  INT, 
    salesrepid  INT, 
    details     XML) 
PARTITION BY RANGE (orderyear, ordermonth)
  (PART q109  STARTING(2009, 1) ENDING (2009, 3) INCLUSIVE,
   PART q209  ENDING (2009, 6) INCLUSIVE,
   PART q309  ENDING (2009, 9) INCLUSIVE, 
   PART q409  ENDING (2009, 12) INCLUSIVE);

-- Insert or load data for 1Q – 4Q 2009 sales into the table  
. . . 

-- Create another table to contain new sales data to be attached
CREATE TABLE currentsales (
    orderid     INT, 
    orderdate   DATE, 
    ordermonth  INT NOT NULL GENERATED ALWAYS AS (month(orderdate)),
    orderyear   INT NOT NULL GENERATED ALWAYS AS (year(orderdate)),
    customerid  INT, 
    salesrepid  INT, 
    details     XML) ;

-- Insert or load new sales data for 1Q 2010 into the "currentsales" table 
. . . 

-- Attach a new partition for the 1Q 2010 sales data.
-- Perform an integrity check for index maintenance, range checking, etc.
ALTER TABLE salespart ATTACH PARTITION q110 
  STARTING (2010, 1) ENDING (2010, 3) INCLUSIVE 
  FROM TABLE currentsales ;

SET INTEGRITY FOR salespart IMMEDIATE CHECKED;

-- Detach the partition containing old sales data from 1Q 2009
ALTER TABLE salespart DETACH PARTITION q109 INTO OLDSALES;

现在,可以使用 Net Search Extender (NSE) 对范围分区表进行全文搜索。


使用多维聚簇提高查询性能

对包含 XML 数据的表进行多维聚簇是另一个新的数据库设计选项。在以前的版本中,这个功能只能应用于不包含 XML 列的表。多维聚簇对于分析应用程序尤其有用,分析应用程序通常会对多个列中的数据执行查询。

例如,分析应用程序可能需要按产品、地区和日期(三个维)获取一个大型事实表中的销售信息。为了支持这样的查询,管理员可以通过使用多维聚簇让 DB2 按这些维组织 SALES 表中的行。与同一产品在同一地区同一时间段内的销售相关的行集中存储在一个或多个数据块中,所以这种设计有助于减少 I/O 和改进多维查询的运行时性能。另外,多维聚簇还可以改进数据重组、插入和删除的性能。

在 DB2 9.7 中,包含 XML 列的表可以应用多维聚簇,但是聚簇维必须由关系列定义。与以前的版本一样,管理员使用 CREATE TABLE 语句的 ORGANIZE BY DIMENSION (…) 子句指定多维聚簇。清单 4 创建一个按产品、地区和日期对销售数据进行多维聚簇的表。

清单 4. 创建使用多维聚簇的包含关系和 XML 数据的表
CREATE TABLE salesMDC (
     id        	INT, 
     product   	VARCHAR(25), 
     region    	VARCHAR(25), 
     time      	DATE, 
     details   	XML)
ORGANIZE BY (product, region, time)

使用 XML 数据和索引压缩提高存储效率和性能

压缩 XML 数据和 XML 索引可以提高存储效率和受 I/O 限制的查询的运行时性能。DB2 9.7 在这两方面提供了新选项。

可以以两种方式压缩 XML 数据:

  • 占用的存储空间少于 32KB 的小型 XML 文档可以与关系数据一起内联存储 在同一行中,可以对整行进行压缩。这种内联功能是在 DB2 9.5 中引入的,现在仍然是有用的选项。
  • 更大的 XML 文档存储在与关系数据分离的数据区域中,它们也可以压缩。在默认情况下,DB2 把 XML 数据放在一个称为 XML Data Area (XDA) 的单独位置,可以处理最大 2GB 的文档。DB2 的新版本允许压缩 XDA 中存储的 XML 数据。

在 DB2 9.7 中,只需通过 CREATE TABLE 语句的 COMPRESS YES 子句启用 XML 数据的压缩功能,这会同时压缩表中的关系和 XML 列。为了取得最好的压缩效果,DB2 使用两个单独的压缩词典,一个用于关系列,另一个用于表的 XML Data Area。这两个词典是在表中填充了几 MB 数据之后自动生成的。还可以为现有的表启用压缩,然后可以重组它以便压缩数据。

IBM 所做的早期测试表明,压缩 XML Data Area 中存储的 XML 数据常常可以节省 60%-80% 的磁盘空间,见图 6。

图 6. 压缩 XDA 中存储的 XML 数据可以节省 60%-80% 的磁盘空间
压缩 XDA 中存储的 XML 数据可以节省 60%-80% 的磁盘空间

图 6 是 IBM 对客户提供的或公共领域中的六个数据集进行测试的结果。这些数据集包含从 2KB 到 100MB 的各种大小的文档。

XML 数据的压缩率取决于文档的结构和复杂度以及其他因素,所以实际压缩效果可能与测试结果差异很大。可以通过查询管理视图 SYSIBMADM.ADMINTABCOMPRESSINFO 判断表的压缩率。清单 5 演示如何查询这个视图,从而了解关系和 XML 数据的压缩分别节省的空间的百分比。

清单 5. 研究关系和 XML 数据的压缩
SELECT tabname, object_type, pages_saved_percent
FROM sysibmadm.admintabcompressinfo
WHERE tabname = 'SALES';

TABNAME  OBJECT_TYPE PAGES_SAVED_PERCENT 
-------- ----------- ------------------- 
SALES    DATA                         69 
SALES    XML                          73 

  2 record(s) selected.

压缩可以减少所需的磁盘空间,这常常会减少磁盘 I/O,增加缓冲区池的命中率(因为压缩的页面允许缓存更多数据)。在许多情况下,由于减少 I/O 和更好的内存利用率产生的性能收益会超过数据压缩和解压所需的额外 CPU 周期的负面影响。

DB2 9.7 中的新技术还可以压缩关系和 XML 索引。实际上,在默认情况下,在压缩的表上创建的索引本身也是压缩的。还可以使用 CREATE INDEX 语句的 COMPRESS [YES|NO] 子句控制是否压缩索引,这独立于表本身的压缩。与数据压缩相似,索引压缩可以减少物理 I/O 和增加缓冲区池的命中率,这常常会提高性能。管理员可以使用新的表函数 (SYSPROC.ADMIN_GET_INDEX_COMPRESS_INFO) 判断索引压缩节省的页面数量,并估计把未压缩的索引改为压缩的索引能够产生的潜在效果。


通过用户定义函数提高应用程序灵活性

DB2 允许应用程序开发人员创建用户定义函数,可以在查询或其他 SQL 语句中调用这些函数。通过创建这种函数,可以把常用(和可能很复杂的)操作组合成各个开发人员可访问的单一模块,这有助于促进代码重用和简化查询开发。开发人员不需要在各个查询中手工编写这些操作,只需在需要它的每个查询中调用函数即可。

DB2 9.7 支持在用户定义函数中使用 XML 数据类型。输入和输出参数都可以是 XML 类型的,用 SQL 编写的用户定义函数可以包含 XML 变量和 SQL/XML 语句。

与编写使用关系数据类型的用户定义函数相比,编写使用 XML 的用户定义函数的差异并不大。函数可以返回单一值(对于标量函数)或多个值(对于表函数)。后者对于从 XML 文档中提取和返回重复的元素尤其有帮助,比如某一客户的多个电话号码或电子邮件地址。

下面两个简短示例说明创建和调用使用 XML 数据的用户定义函数是多么容易。清单 6 创建一个标量函数,它从输入文档中提取出一个特定的 XML 元素。然后,在一个简单的 SQL 查询中调用此函数,从而返回给定的客户的姓名。(这里使用 “#” 符号表示语句结束)。

清单 6. 创建和调用使用 XML 数据的标量用户定义函数
--- Create the user-defined scalar function called "getname" 
CREATE FUNCTION getname(doc XML) 
RETURNS VARCHAR(25)
BEGIN ATOMIC
  RETURN XMLCAST(XMLQUERY('$d/customerinfo/name' 
                           PASSING doc AS "d") 
             AS VARCHAR(25)); 
END #

-- Invoke the "getname" scalar function and inspect the result
SELECT getname(info) AS name
FROM customer 
WHERE cid = 1002 #

NAME
------------------------- 
Jim Noodle

 1 record(s) selected.

创建返回多个值的表函数也不太困难。清单 7 创建一个表函数,它返回提供的 XML 文档中包含的每个客户的电话号码。可以在简单的 SQL 查询中轻松地调用此函数。

清单 7. 创建和调用使用 XML 数据的表用户定义函数
-- Create the user-defined table function called "getname" 
CREATE FUNCTION getphone(doc XML)
RETURNS TABLE(type VARCHAR(10), number VARCHAR(20))
BEGIN ATOMIC
  RETURN
    SELECT type, number
    FROM XMLTABLE('$d/customerinfo/phone' PASSING doc AS "d"
           COLUMNS
              type   VARCHAR(10)  PATH '@type',
              number VARCHAR(20)  PATH '.') ;
END #

--- Invoke the "getphone" table function and inspect the result
SELECT cid, p.type, p.number 
FROM customer, TABLE(getphone(info)) p 
WHERE cid = 1004 #

CID                TYPE       NUMBER
----------------   ---------- --------------------
            1004   work       905-555-4789
            1004   home       416-555-3376

 2 record(s) selected.

当然,DB2 仍然支持在存储过程中使用 XML 数据类型,这个功能在以前的版本中已经引入了。


管理、应用程序开发和性能方面的其他改进

DB2 9.7 中的其他 pureXML 技术为管理数据库、简化应用程序开发和改进运行时性能提供更多支持。本节介绍这些特性。

分析 XML 内联

管理员可以使用系统提供的两个新函数分析小型 XML 文档的内联。可以使用 SYSPROC.ADMIN_IS_INLINED 函数判断 DB2 是否能够根据在创建(或修改)表时指定的最大内联长度内联存储输入的 XML 文档。另一个函数 SYSPROC.ADMIN_EST_INLINE_LENGTH 可以估计需要指定的最小内联长度,这个长度使 DB2 能够把给定的 XML 文档与同一行中的关系数据存储在同一页面上。这些特性有助于管理员更好地调整物理数据库设计。

清单 8 演示如何使用这些新的 DB2 函数。

清单 8. 用新的 DB2 函数分析 XML 数据内联
-- Create the customer table with a maximum inline 
-- length of 1000 bytes for XML data 
CREATE TABLE customer(id int, xmlcol XML INLINE LENGTH 1000);

--- Insert or LOAD some data into the table
INSERT INTO customer VALUES (…); 
. . . 

-- Query the table using two new DB2 functions 
-- for analyzing XML inlining
SELECT id, ADMIN_IS_INLINED(info) AS inlined,
           ADMIN_EST_INLINE_LENGTH(info) AS inline_length
FROM customer;

-- Inspect the result set.
-- "1" in the second column indicates that the XML was inlined.
-- "0" in the second column indicates that the XML was not inlined.
-- "-1" in the third column indicates that the XML is too big 
--      to be inlined with the current page size.

ID      INLINED  INLINE_LENGTH  
------- -------- -------------
   1000        1           770      -- Inlined. Uses approx 770 bytes
   1001        0          2345
   1002        1           796
   1003        0          1489      -- Not inlined. Inline size of at least 1489 needed 
   1004        0          1910
   1005        0            -1      -- Too large to be inlined for the given page size

清单 8 创建一个包含内联的 XML 列的表,如果 XML 文档占用的空间小于 1000 字节,就把 XML 文档内联存储在关系行中,否则存储在 XML Data Area 中。在表中插入一些数据之后,通过调用两个新函数,判断 (a) XML 文档是否内联存储在行中,(b) 在当前行中允许文档内联的 XML 文档估计长度。

在线创建和重组 XML 索引

在以前的 DB2 版本中,在创建或重组 XML 数据上的索引时,插入、更新或删除事务无法修改表中的数据。DB2 中新的改进消除了这一限制,这可以显著提高灵活性,避免在需要创建和重组 XML 索引时出现应用程序延迟或停止运行。因此,DB2 能够为应用程序提供更好的数据可用性。

在 DB2 9.7 中,与创建关系索引一样,XML 索引创建操作在默认情况下允许并发的写操作。在重组 XML 索引时,数据库管理员可以通过在 REORG INDEXES 命令中使用 ALLOW WRITE ACCESS 子句允许并发的写操作。

分解多个 XML 文档

DB2 的新版本扩展了内置的分解功能,能够处理多个 XML 文档。以前的 DB2 版本只允许每个分解操作处理一个 XML 输入文档。在 DB2 的新版本中,有一个系统提供的新的存储过程 (XDB_DECOMP_XML_FROM_QUERY),它以一个现有的 DB2 表作为输入,让管理员能够分解给定列中包含的数据。对于需要分解 XML 数据的部分或全部内容的数据库设计,可以在批量装载 XML 或 BLOB 数据之后调用这个存储过程。与以前的 DB2 版本一样,DB2 的分解功能依靠带注释的 XML 模式把 XML 属性和元素映射到关系表的特定列。

获取 XML 模式检验诊断信息

系统提供的存储过程 XSR_GET_PARSING_DIAGNOSTICS 向程序员提供详细的诊断信息,帮助他们了解 DB2 在解析 XML 文档或针对 XML 模式检验 XML 文档时检测到的错误。这个功能是在 DB2 9.5, Fix Pack 3 中首次引入的,它可以帮助程序员判断问题并根据需要纠正 XML。

如果 XML 文档不是良构的,或者对于给定的 XML 模式是无效的,那么对此文档调用 XSR_GET_PARSING_DIAGNOSTICS 过程并可选地提供 XML 模式。过程会产生详细的错误信息,包括:

  • XML 文档中错误位置的行号和列号
  • 指向文档中错误位置的 XPath
  • 原始错误消息、原因编码和任何适用的错误标志

使用全局临时表

这里有必要提到现在支持在声明的全局临时表中包含 XML 列,因为这可以帮助程序员提高应用程序的运行时性能。如果程序员需要获取将在应用程序中频繁使用的数据,那么可以把数据缓存在声明的全局临时表中,然后在应用程序会话中反复操作这些数据。这会尽可能减少锁和日志记录。在会话终止时删除临时表的内容。

改进对 XML 数据的 SQL 访问

DB2 9.7 中的查询优化技术能够提高针对 XML 数据的关系视图的查询处理效率。DB2 会在适合的情况下自动地应用这种技术,所以程序员不需要做任何事,就能够享有运行时性能收益。

在处理针对 XML 数据的关系视图的查询时,DB2 9.7 会尽可能使用 XML 索引。下面通过一个简单的示例说明它的工作原理。清单 9 创建一个职员数据表,其中包含一个 XML 列。它还在职员办公室编号上创建一个 XML 索引,这个数据可能作为 XML 元素在职员记录中出现。最后,它创建一个视图,这个视图提取并以关系列的形式提供职员 ID、名字、姓氏和办公室编号。

清单 9. 创建表、XML 索引和关系视图
-- Create a table with an XML column.
CREATE TABLE emp(doc XML);

-- Create an XML index on the table. 
CREATE INDEX officeIdx ON emp(doc) GENERATE KEYS USING 
XMLPATTERN '/dept/employee/office' AS SQL VARCHAR(20);

-- Create a relational view of the XML data managed by the table.
CREATE VIEW emp_rel_view(id, first_name ,last_name ,office) AS
SELECT X.* FROM emp,
  XMLTABLE ('$d/dept/employee' passing doc as "d" 
   COLUMNS 
      empID      INTEGER     PATH '@id',
      firstname  VARCHAR(5)  PATH 'name/first',
      lastname   VARCHAR(5)  PATH 'name/last',
      office     INTEGER     PATH 'office') AS X;

现在考虑清单 10 中的 SQL 语句,它通过查询视图选择办公室 R344 中所有职员的 ID 和名字。

清单 10. 用筛选条件(查询谓词)查询视图
SELECT id, first_name 
FROM emp_rel_view 
WHERE office = 'R344';

WHERE 子句中的谓词限制关系列 office,而视图把这一列映射到 XML 文档中的路径 /dept/employee/office。DB2 9.7 中新的优化技术让 DB2 能够自动地使用底层 XML 列上定义的 XML 索引 officeIdx 来处理这个查询。在适当的情况下使用可用的 XML 索引能够提高运行时性能。

不能直接理解 XML 数据的应用程序(比如许多业务报告工具)可以受益于这种视图和 DB2 9.7 技术(这有时候称为谓词下推 )。这种优化特性让应用程序能够使用 SQL 查询通过传统的关系接口高效地查询 XML 数据。


结束语

在 DB2 9.7 中,IBM 在一些重要的方面继续扩展了 DB2 pureXML 技术。新的数据库设计选项能够提高分析应用程序和面向事务的应用程序的可伸缩性和性能。新的 XML 数据和索引压缩支持可以减少所需的磁盘空间,可以提高受 I/O 限制的操作的运行时性能。支持在用户定义函数和全局声明临时表中使用 XML,这有助于开发应用程序。最后,系统提供的新的函数和存储过程有助于简化数据库设计和维护工作。

致谢

衷心感谢 Henrik Loeser 和 Susan Malaika 为本文做出的贡献!

参考资料

学习

获得产品和技术

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Information Management, XML
ArticleID=391343
ArticleTitle=用新的 DB2 V9.7 pureXML 特性增强 XML 数据的业务洞察力和可伸缩性
publish-date=05252009