DB2 9中15个pureXML性能最佳实践
2010-02-18 15:01:05 来源:WEB开发网提示14:对于短小的查询或 OLTP应用程序,使用带参数占位符的SQL/XML语句
非常短的数据库查询常常执行得很快,以至于编译和优化它们的时间占总体响应时间的很大比例。因此,只将它们编译(“准备”)一次,然后在每次执行时只传递谓词的字面值,这样做很有用。虽然 DB2 9 XQuery 不支持外部参数,但是SQL/XML函数 XMLQUERY、XMLTABLE和 XMLEXISTS 却支持外部参数。这些函数允许传递 SQL参数占位符,作为嵌入式 XQuery 表达式的一个变量。对于具有短小、重复的查询的应用程序,建议这样做。
清单 14. 硬编码的字面值
for $c in db2-fn:xmlcolumn('CUSTOMER.INFO')/customer
where $c/phone = "905-555-4789"
return $c;
select info
from customer
where xmlexists('$i/customerinfo[phone = "905-555-4789"]'
passing info as "i")
清单 15. 使用参数占位符
select info
from customer
where 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)或编码声明决定的,例如
<?xml version="1.0" encoding="UTF-8" ?>
从性能的角度来看,我们的目标是尽可能避免代码页转换,因为它们要消耗额外的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 customer
where...;
如果应用程序要处理非常大的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性能。
- ››db2 对float类型取char后显示科学计数法
- ››DB2中出现SQL1032N错误现象时的解决办法
- ››DB2 锁升级示例
- ››db2诊断系列之---定位锁等待问题
- ››db2 命令选项解释
- ››性能自检Win7快速提高系统性能3技巧
- ››DB2 最佳实践: 使用 DB2 pureXML 管理 XML 数据的...
- ››DB2 9.5 SQL Procedure Developer 认证考试 735 准...
- ››DB2 9.5 SQL Procedure Developer 认证考试 735 准...
- ››DB2 9.5 SQL Procedure Developer 认证考试 735 准...
- ››DB2 基础: 表空间和缓冲池
- ››DB2 XML 编程,第 1 部分: 理解 XML 数据模型
更多精彩
赞助商链接