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系统工程师
清单 8. 使用 RUNSTATS 收集统计信息
                        runstats on table myschema.customer with distribution on all columns and detailed indexes all;runstats on table myschema.customer with distribution on all columns and detailed indexes all tablesample system (10);runstats on table myschema.customer on all columns and sample detailed indexes all tablesample bernoulli (15);


总而言之,如果有可用的 XML 统计信息,DB2 可以生成更好的执行计划。像通常那样使用 runstats,或者利用抽样使用 runstats,以减少它的执行时间。

提示 12:如何使用 SQL/XML 发布视图将关系数据暴露为 XML


SQL/XML 发布函数允许将关系数据转换成 XML 格式。较好的做法是将 SQL/XML 发布函数藏在一个视图定义中,使应用程序和其他查询可以从视图中选择构造好的 XML 文档,而不必与发布函数本身打交道。
清单 9. 隐藏在视图中的 SQL/XML 发布函数
                        create table unit( unitID char(8), name char(20), manager varchar(20));create view UnitView(unitID, name, unitdoc) as   select unitID, name,           XMLELEMENT(NAME "Unit",             XMLELEMENT(NAME "ID", u,unitID),             XMLELEMENT(NAME "UnitName", u.name),             XMLELEMENT(NAME "Mgr", u.manager)                  )   from unit u;


注意,我们在视图定义中包括了一些关系列。这并没有产生任何物理上的冗余,因为它只是一个视图,而不是物化的视图。暴露关系列有助于有效地查询这个视图。假设我们需要取一个对应于特定单位的 XML 文档。下面三个查询都可以实现这一点,但是第三个查询要好于前两个查询。
在前两个查询中,过滤谓词是在构造的 XML 上表达的。但是,XML 谓词不能应用于底层关系列或它的索引。因此,这些查询要求视图为所有单位构造 XML,然后选出对应于单位 “WWPR” 的 XML。这并非最佳方法。
以下查询可能取得次优性能:
清单 10. 次优的查询
                        select unitdocfrom UnitViewwhere xmlexists('$i/Unit[ID = "WWPR"]' passing unitdoc as "i");for $u in db2-fn:xmlcolumn('UNITVIEW.UNITDOC')/UNIT where $u/ID = "WWPR"return $u;


第三种方法使用一个关系谓词来确保只为 “WWPR” 构造 XML 文档,从而减少了运行时间,对于大型的数据集,这种方法带来的性能好处尤其显著。这个查询可以取得很好的性能:
清单 11. 性能较好的查询
                                select unitdocfrom UnitViewwhere UnitID = "WWPR";


总而言之,将关系列包括在 SQL/XML 发布视图中,在查询视图时,在那些关系列上表达谓词,而不是在构造的 XML 上表达谓词。

提示 13:如何使用 XMLTABLE 视图以关系格式暴露 XML 数据

创建一个视图以 XML 格式暴露关系数据,这样做很有用。同样,您可能也想使用一个视图将 XML 数据暴露为关系格式。提示 12 中的提醒也适用于这里的情况,只不过顺序要倒过来。让我们来看看下面的例子,其中使用了 SQL/XML 函数 XMLTABLE 以标量格式返回 XML 文档中的值:


清单 12. 以标量格式返回的 XML 文档中的值
                                create table customer(info XML);create view myview(CustomerID, Name, Zip, Info) as SELECT T.*, info FROM customer, XMLTABLE ('$c/customerinfo' passing info as "c"    COLUMNS    "CID"     INTEGER      PATH './@Cid',   "Name"    VARCHAR(30)  PATH './name',   "Zip"     CHAR(12)     PATH './addr/pcode' ) as T;


注意,我们将 XML 列 info 包括在视图定义中,以便帮助有效地查询这个视图。假设您想基于给定的 ZIP 号码检索客户 ID 和姓名的一个标量列表。下面两个查询都可以实现这一点,但是第二个查询比第一个查询的性能要好。在第一个查询中,过滤谓词是在由 XMLTABLE 函数生成的 CHAR 列 “Zip” 上表达的。但是,关系谓词不能应用于底层的 XML 列或它的索引。因此,这个查询要求视图为所有 客户生成行,然后根据邮政编码 “95141” 选择符合条件的行。这不是最佳方法。第二个查询使用一个 XML 谓词来确保只生成对应于 “95141” 的行,从而减少了运行时间,对于大型的数据集,这种方法带来的性能好处尤其显著。
清单 13. 包含 XML 谓词的查询
                                -- may perform suboptimal:select CustomerID, Name from myviewwhere Zip = "95141";-- will perform well:select CustomerID, Namefrom myViewwhere xmlexists('$i/customerinfo[addr/pcode = "95141"]' passing info as "i");


如果定义视图所用的基表不仅包含一个 XML 列,还包含有索引的关系列,那么应该将那些关系列包含在视图定义中。如果对视图的查询包含关系列上的具有高度限制性的谓词,那么 DB2 使用关系索引来过滤符合条件的行,得到较小数量的行,然后在返回最终结果集之前,对这个中间结果应用 XMLTABLE 和其他谓词。
总而言之,在使用 XMLTABLE 视图将 XML 数据暴露为关系格式时要加以小心。应该尽可能在视图定义中包含其他的列,以便在那些列上表达过滤谓词,而不是在 XMLTABLE 列上表达过滤谓词。

提示 14:对于短小的查询或 OLTP 应用程序,使用带参数占位符的 SQL/XML 语句


非常短的数据库查询常常执行得很快,以至于编译和优化它们的时间占总体响应时间的很大比例。因此,只将它们编译(“准备”)一次,然后在每次执行时只传递谓词的字面值,这样做很有用。虽然 DB2 9 XQuery 不支持外部参数,但是 SQL/XML 函数 XMLQUERY、XMLTABLE 和 XMLEXISTS 却支持外部参数。这些函数允许传递 SQL 参数占位符,作为嵌入式 XQuery 表达式的一个变量。对于具有短小、重复的查询的应用程序,建议这样做。
清单 14. 硬编码的字面值
                                for $c in db2-fn:xmlcolumn('CUSTOMER.INFO')/customerwhere $c/phone = "905-555-4789"return $c;select info from customerwhere xmlexists('$i/customerinfo[phone = "905-555-4789"]'                 passing info as "i")
IT分销/经销 · 2011-05-16
浏览532

回答者

liuliping
系统工程师

liuliping 最近回答过的问题

回答状态

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