IT分销/经销数据库

DB2 9 中 15 个 pureXML 性能最佳实践

简介DB2 9 中的 pureXML 支持为管理 XML 数据提供了有效的、多方面的功能。对于很多 XML 应用程序而言,性能是高度优先考虑的一个方面。DBA 和应用程序设计人员都可以通过他们份内的工作来确保良好的性能。首先,我们有关于 DB2 各个方面的所有传统的性能指南,包括 CPU/内存/...显示全部

简介

DB2 9 中的 pureXML 支持为管理 XML 数据提供了有效的、多方面的功能。对于很多 XML 应用程序而言,性能是高度优先考虑的一个方面。DBA 和应用程序设计人员都可以通过他们份内的工作来确保良好的性能。首先,我们有关于 DB2 各个方面的所有传统的性能指南,包括 CPU/内存/磁盘配置的平衡、表空间和缓冲池的调优、锁、日志记录、查询执行计划等。所有这些话题在之前的 DB2 文章里都曾论述过(见 参考资料),并在管理 DB2 中的 XML 数据时仍然适用。

DB2 9 是同时支持关系型数据与 XML 数据的新一代数据服务器。请到 DB2 9 技术资源中心 获取更多的关于 DB2 9 的技术文章、教程、下载以及多媒体信息。


幸运的是,这些问题当中有很多问题是由 DB2 的自治存储和自调优内存管理等自治功能来处理的。它们为很多应用程序提供了高水平的性能,要求的手动干预很少。但是,具有更高性能需求的 XML 应用程序还可以从其他性能方面的考虑当中受益。本文集中讨论这方面的情形,同时给出为 DB2 9 中与 XML 相关的应用程序取得最佳性能的提示和指南。
本文将讨论和阐述 15 个 XML 性能提示(排序不分先后)。这 15 个提示涵盖了很多领域,但是经验表明,存在性能问题的应用程序通常只需要应用其中一两个提示就能达到所需的性能。提示 1: 理智选择 XML 文档的粒度。 提示 2: 为了取得更好的 XML 性能,使用 DMS 和更大的页。 提示 3: 必要时,如何将 XML 数据放入一个单独的表空间中。 提示 4: 如何配置 DB2,以便快速地成块插入 XML 数据。 提示 5: 使用新的快照监视器元素检查 XML 性能。 提示 6: 了解 XML 模式验证的开销。 提示 7: 在 XPath 表达式中,尽可能使用全限定路径。 提示 8: 定义倾斜的 XML 索引,并避免为任何东西都建索引。 提示 9: 将文档过滤谓词放入 XMLEXISTS 中,而不是放入 XMLQUERY 中。 提示 10: 使用方括号 [ ] 来避免 XMLEXISTS 中的 Boolean 谓词。 提示 11: 使用 RUNSTATS 收集 XML 数据和索引的统计信息。 提示 12: 如何使用 SQL/XML 发布视图将关系数据暴露为 XML。 提示 13: 如何使用 XMLTABLE 视图以关系格式暴露 XML 数据。 提示 14: 对于短小的查询或 OLTP 应用程序,使用带参数占位符的 SQL/XML 语句。 提示 15: 避免 XML 插入和检索期间出现代码页转换。

在对这些性能提示的讨论中,我们假设您熟悉基本的 DB2 管理和性能实践,并熟悉基本的 DB2s pureXML 支持。例如,您应该知道 XML 列、XML 索引,以及如何用 SQL/XML 和 XQuery 查询 XML 数据。

收起
参与9

查看其它 7 个回答liuliping的回答

liulipingliuliping系统工程师
清单 15. 使用参数占位符
                                select info from customerwhere xmlexists('$i/customerinfo[phone = $p]'                 passing info as "i", cast(? as varchar(12)) as "p")


总而言之,短小的查询和 OLTP 事务就像含参数占位符的预置语句一样,具有更快的速度。对于 XML,这要求 SQL/XML 将 SQL 型参数传递给 XQuery 表达式。

提示 15:避免 XML 插入和检索期间出现代码页转换


XML 不同于 DB2 中其他类型的数据,因为它可以在内部编码,也可以在外部编码。内部编码意味着 XML 数据的编码可以源于数据本身。外部编码意味着编码源于外部信息。用于与 DB2 交换 XML 数据的应用程序变量的数据类型决定了如何得到编码。如果应用程序为 XML 使用字符类型的变量,那么它就要在外部编码,即在应用程序代码页中编码。如果使用二进制应用程序数据类型,那么 XML 数据考虑采用内部编码。内部编码意味着编码是由 XML 文档本身包含的 Unicode Byte-Order mark(BOM)或编码声明决定的,例如

从性能的角度来看,我们的目标是尽可能避免代码页转换,因为它们要消耗额外的 CPU 周期。内部编码的 XML 数据比外部编码的数据更为可取,因为它可以防止不必要的代码页转换。这意味着,在应用程序中,应该优先选择二进制数据类型,而不是字符类型。例如,在 CLI 中,当使用 SQLBindParameter() 将参数占位符绑定到输入数据缓冲区时,应该使用 SQL_C_BINARY 数据缓冲区,而不是 SQL_C_CHAR、SQL_C_DBCHAR 或 SQL_C_WCHAR 数据缓冲区。当从 Java 应用程序中插入 XML 数据时,将 XML 数据读入为二进制流(setBinaryStream)比字符串(setString)更好。类似地,当 Java 应用程序从 DB2 接收 XML,并将它写到一个文件的时候,如果 XML 被写成非二进制数据,就会发生代码页转换。
当从 DB2 中将 XML 数据检索到应用程序中时,该数据被串行化。串行化是 XML 解析的逆向操作。这个过程将 DB2 的内部 XML 格式(解析后的树型表示)转换成应用程序能理解的原始的 XML 格式。在大多数情况下,最好是让 DB2 执行隐式的串行化。这意味着 SQL/XML 语句只需选择 XML 类型的值,而 DB2 尽可能高效地将其串行化为应用程序变量,如下面的例子所示:
清单 16. 含隐式串行化的查询
                                create table customer(info XML);select info from customer where...;select xmlquery('$i/customerinfo/name' passing info as "i") from customerwhere...;


如果应用程序要处理非常大的 XML 文档,那么可以将 LOB 定位符用于数据检索。这就要求显式地串行化为 LOB 类型,更可取的是 BLOB 类型,因为串行化为字符类型(例如 CLOB)会带来编码问题和不必要的代码页转换。显式串行化使用 XMLSERIALIZE 函数:
select XMLSERIALIZE(info as BLOB(1M)) from customer where...;


总而言之,在应用程序中应该使用二进制数据类型来与 DB2 交换 XML,因为这样做可以避免不必要的代码页转换。要了解编码问题,如果有疑问,可以参考 DB2 9 文档中的详细指南。

结束语

为了在 DB2 中达到最佳 XML 性能,首先要从使用 DB2 的自治特性(例如自治存储和自调优内存管理)开始。这样可以为很多应用程序提供很好的、开箱即用的性能。这样做还为 DBA 节省了宝贵的时间,让他们可以将精力放在更有针对性的性能调优上。所有传统的 DB2 性能方面的知识仍然适用于 XML,下面列出的各种 developerWorks 文章都对它们做了论述。
在此基础上,本文中的 15 个提示可以在一些常见的与 XML 有关的性能方面为您提供帮助。如果需要改善 XML 应用程序的性能,不必应用所有这 15 个提示,其中往往只有一两个提示是与您的情况相关的。例如,如果由于表空间配置有问题,系统在 I/O 方面存在瓶颈,那么减少不必要的代码页转换仍然无济于事。类似地,如果实际上是需要执行 runstats 来支持更好的查询执行计划,那么使用 SQL/XML 参数占位符可能没有帮助。简而言之,本文中的提示可以帮助您避免 性能问题,但是要修复观察到的 性能问题,首先需要找出问题的根源和瓶颈。和对待关系数据一样,可以使用 DB2 中的标准诊断工具(例如 visual explain、db2exfmt 和快照监视器)来调查 XML 性能。
IT分销/经销 · 2011-05-16
浏览537

回答者

liuliping
系统工程师

liuliping 最近回答过的问题

回答状态

  • 发布时间:2011-05-16
  • 关注会员:1 人
  • 回答浏览:537
  • X社区推广