商讯信箱
用户名: @
密  码:   注册|忘记密码
登录
个人用户经销商
您的位置:首页 > 技术频道 > 正文

         索引

    除了提供新的 XML 层次化存储管理支持之外,DB2 还提供了新的索引技术来加快涉及 XML 数据的搜索。与关系索引相似,这些新的 XML 索引也是用熟悉的 SQL DDL 语句创建的:CREATE INDEX。但是,除了指定要建立索引的目标列之外,还要指定 “xmlpattern”(这本质上是一个没有谓词的 XPATH 表达式)来标识感兴趣的 XML 文档子集。

    例如,使用前面的 “items” 表定义和 图 2 所示的示例 XML 文档,管理员可以发出以下语句对 “comments” 列中包含的所有评论标识符(“CommentID” 值)建立索引。注意,示例文档中的 “CommentID” 元素是 “Comment” 元素的子元素,“Comment” 元素本身是根元素 “Comments” 的子元素。

    清单 2. 为 XML 列创建索引

create index myindex on items(comments) generate key using xmlpattern '/Comments/Comment/CommentID' as sql double

    有几个细节值得注意。“xmlpattern” 子句中指定的路径是大小写敏感的。因此,“/Comments/Comment/CommentID” 与 “/comments/comment/commentid” 并不对相同的 XML 元素值建立索引。另外,因为 DB2 并不要求对于一个给定的 XML 列必须有 XML 模式,所以 DB2 可能不知道什么数据类型与指定的模式相关联。用户必须使用支持的 SQL 类型之一(VARCHAR、VARCHAR HASHED、DOUBLE、DATE 和 TIMESTAMP)显式地指定数据类型。

    最后,尽管使用 SQL DDL 语句来创建 XML 索引,但是 XML 数据上的索引与传统 SQL 数据类型列上的索引是不一样的。DB2 XML 索引技术的细节超出了本文的范围,但是应该注意两个显著的差异:

    XML 数据上的索引通常只涉及文档(列)内容的一个子集。与此相反,传统 SQL 数据上的索引总是涉及整个列的内容。
表中的一行可能会产生多个 XML 索引项,因为一个 XML 文档可能包含零个、一个或许多个与指定的 xmlpattern 匹配的 “节点”。与此相反,非 XML 索引对于表中的每一行只包含一项。
对于某些应用程序,全文搜索是很重要的。IBM 扩展了 DB2 的文本搜索功能,使其能够搜索 XML 列中存储的数据。对 CREATE INDEX 语句的扩展使管理员能够创建全文索引,从而帮助改进这种搜索的性能。

    查询语言和优化

    DB2 新的 XML 支持包含新的查询语言功能。程序员现在可以使用 SQL 或 XQuery 搜索数据,XQuery 是一种新的查询语言,支持导航(即基于路径的)表达式。实际上,应用程序可以自由地使用这两种语言的语句,而且一个查询语句可以结合使用 SQL 和 XQuery。

    在本文中,我们没时间广泛深入地研究这些功能,所以只讨论几个要点。如果您是没有 XML 经验的 SQL 程序员,那么不必担心,因为用简单的 SQL 语句就能够检索 XML 列中存储的数据内容。例如,下面两个熟悉的查询返回 “items” 表中与特定的库存单位(SKU)相关的所有数据,包括带有顾客评论的 XML 文档:

    清单 3. 用 SQL 查询 XML 数据

select * from items where sku = 112233 select id, brandname, itemname, sku, srp, comments from items where sku = 112233

    我们现在考虑另一种情况,在这种情况下只想获得 “items” 表的顾客评论中包含的消息,而且希望使用 XQuery 来完成。下面是构造这个语句最简单的方式:

    清单 4. 用 XQuery 查询 XML 数据

xquery db2-fn:xmlcolumn('ITEMS.COMMENTS')/Comments/Comment/Message

    因为 DB2 支持两种查询语言,所以用户必须在 XQuery 语句前面加关键词 “xquery”。“db2-fn:xmlcolumn” 函数是指定要查询的目标数据的一种方法。它的参数指定表的 XML 列 —— 在这个例子中是 ITEMS 表的 COMMENTS 列。这个查询还将目标数据进一步限制到 XML 数据的特定子集 —— 即 “Message” 元素的值,这个元素是 “Comment” 元素的子元素,“Comment” 元素本身是根元素 “Comments” 的子元素。(参见 图 2。)

    可以使用 FLWOR 表达式构造同样的查询,这种表达式常常与 XQuery 语句相关联。FLWOR 表达式是一种引用 for、let、where、order by 和 return 子句的非正式方式。它使程序员能够循环遍历 XML 文档中的节点组并将变量绑定到中间结果。对于这个查询示例,可以使用 for 和 return 表达式从顾客评论中获得消息,如下所示:

    清单 5. 使用 XQuery 的 FOR 和 RETURN 子句

xquery for $y in db2-fn:xmlcolumn('ITEMS.COMMENTS')/Comments/Comment return ($y/Message)

    应该注意,DB2 Viper 附带一个 Developer's Workbench,这是一种基于 Eclipse 的开发工具,其中包含的图形化 XQuery 构建器可以帮助用户生成和测试查询。

    SQL 和 XQuery 可以组合在一个语句中,从而同时限制对 XML 和非 XML 列的搜索。例如,考虑以下 XQuery 语句:

    清单 6. 将 SQL 和 XQuery 组合在一个语句中

xquery db2-fn:sqlquery('select comments from items where srp > 100')/Comments/Comment/Message

    db2-fn:sqlquery 子句限制了 XQuery 语句的输入;具体地说,只有与建议零售价(srp)大于 $100 的商品相关联的顾客评论才作为输入传递。其他 XQuery 信息表示 DB2 应该只返回这些评论的 “Message” 部分。

    许多文章和 Web 站点可以帮助您学习 DB2 的 SQL/XML 扩展、DB2 的 XQuery 支持和新兴的 XQuery 标准(参见 “参考资料” 中的链接。)

    最后,关于查询语言还有一个相关的主题:查询优化。DB2 有两个查询语言分析器:一个用于 XQuery,另一个用于 SQL。它们都生成一种通用的与语言无关的内部查询表示。这意味着用这两种语言编写的查询都会从 DB2 的基于开销的查询优化技术获益,这包括高效地重写查询操作符以及选择低开销的数据访问计划。另外,DB2 可以利用新的查询和联结操作符以及新的索引处理技术,为涉及 XML 文档的查询提供更好的运行时性能。

    XML 模式和检验

    XML 灵活的本质有时候让数据库专业人员对数据质量很担心。正如前面提到的,DB2 允许用户在 XML 数据类型的任何列中存储任何良构的 XML 文档。因此,一个列中可以包含具有不同结构(即模式)和不同内容的文档。如果数据的本质是不清楚的,或者是难以预测的,那么这样的灵活性是绝对必要的。但是在其他情况下,它可能成为麻烦。所以,DB2 允许用户注册他们的模式并要求 DB2 在进行存储之前针对这些模式检验 XML 文档。

    XML 模式仅仅是良构的 XML 文档,它们描述了其他文档的结构和内容。例如,XML 模式指定哪些元素是有效的,这些元素在文档中应该以什么次序出现,与每个元素相关联的 XML 数据类型,等等。有各种工具可以帮助您从现有的 XML 文档创建 XML 模式,包括 IBM WebSphere® Studio 系列及其附属品牌 Rational® 产品。

    在一个列中,用户可以存储与不同模式对应的不同 XML 文档。这显然是因为不断变化的业务需求会影响需要捕捉的 XML 数据的结构和内容。考虑前面的 “items” 表,假设在部署这个表几个月之后,决定在 XML 列中捕捉其他信息,比如更多的顾客联系信息、响应某些评论的操作的记录等等。DB2 可以适应这些新的内容,并不需要改变表的结构或依赖于这个表的应用程序。实际上,现有的数据(基于 “旧的” XML 模式)仍然存在,同时可以添加符合一个或多个新模式的新数据。按照这种方式,管理员可以以最少的部署时间和开销支持新的业务需求。而且,他们不会损害 XML 的完整性 —— 他们只是向 DB2 提供新的信息,说明某种 XML 数据也是 “有效的”。

    在 DB2 的内部存储库中注册 XML 模式是很简单的。DB2 提供了存储过程来使这个过程自动化,管理员也可以手动发出相应的命令。如果需要,可以使用一个模式检验多个表中的多个 XML 列。

    管理支持

    DB2 新的 XML 支持包括对熟悉的管理工具的扩展,可以帮助管理员管理和调整数据库。例如,备份和恢复设施(包括用于故障恢复的高可用性数据复制)都支持 XML 列中存储的文档。同样,对 IMPORT 和 EXPORT 的扩展现在可以同时在传统 SQL 数据和 XML 数据上操作。因此,可以发出一个 IMPORT 命令来填充整个 “items” 表(从原始文件读取 XML 数据),发出一个 EXPORT 命令将所有表数据写到外部文件。

    另外,DB2 的图形化管理工具 DB2 Control Center 使管理员能够浏览包含 XML 数据的表、创建和管理基于 XML 的索引、发出 SQL/XML 和 XQuery 语句以及执行许多其他管理任务。因为性能常常是关注的重点,相应的 DB2 设施也进行了扩展来适应 XML 数据。这些设施包括 DB2 Snapshot Monitor,它提供对某一时刻 DB2 活动的汇总(即 “快照”);RUNSTATS,它收集 DB2 数据库中存储的数据的统计信息;以及 EXPLAIN,它报告查询优化器为满足给定请求所选择的访问路径。管理员可以通过研究 EXPLAIN 的输出来判断使用了哪些 XML 索引。

    程序语言扩展

    如果程序员无法可靠地访问数据库中存储的 XML 数据,那么 DB2 新的 XML 支持的意义就不大了。由于认识到了这一点,IBM 对它的各种编程语言接口进行了增强,从而支持轻松地访问 XML 数据。这些增强覆盖 Java™(JDBC)、C(嵌入式 SQL 和调用级接口)、COBOL(嵌入式 SQL)、PHP 和 Microsoft® 的 .NET 环境(通过 DB2.NET 数据提供程序)。

    因为应用程序编程接口(API)与使用的编程语言相关,我们无法在这里一一讨论这些扩展。可以在最近发表的论文 “Native XML Support in DB2 Universal Database” 中读到对这些扩展的总结(参阅 “参考资料”),还可以阅读文章 “结合使用 DB2 原生 XML 与 PHP”。

    结束语

    DB2 Viper 版是 IBM 的第一个 “混合型”(即多结构)数据库管理系统实现。除了支持表数据模型之外,DB2 还支持 XML 文档和消息中固有的层次化数据模型。用户可以在一个表中自由地混合存储传统 SQL 数据和 XML 数据。还可以使用 SQL(如果愿意,可以加上 XML 扩展)和 XQuery(新出现的 XML 数据查询标准)来查询和处理这两种形式的数据。通过在经过实践检验的数据库管理基础设施上进行扩展,IBM 为 DB2 Viper 用户提供了同时处理关系数据和 XML 数据的强大支持。

1 2 3
©版权所有。未经许可,不得转载。
[责任编辑:张志国]