DB2 9中15个pureXML性能最佳实践
2010-02-18 15:01:05 来源:WEB开发网提示9:将文档过滤谓词放入XMLEXISTS中,而不是放入XMLQUERY中
让我们来考虑下面的表和数据:
create table customer(info XML);
表 2. customer 表中的三行数据
<customerinfo> |
<customerinfo> |
<customerinfo> |
对于这个表,假设您想返回电话号码为“905-555-4789”的客户的姓名。 您可能禁不住想编写下面这样的查询:
select xmlquery('$i/customerinfo[phone = "905-555-4789"]/name' passing info as "i")
from customer;
但是,这个查询并不是您想要的,原因有好几个:
它返回下面这样的结果集,其中的行数与表中的行数一样多。这是因为SQL语句没有 where 子句,因此不能排除任何行。
<name>Matt Foreman</name> |
3 record(s) selected
对于表中与谓词不匹配的每一行,返回一个包含空的XML 序列的行。这是因为XMLQUERY函数中的XQuery 表达式每次应用于一行(文档),并不会从结果集中去掉一行,只是修改它的值。那个 XQuery 产生的值,当谓词为true 时为客户的name 元素,否则为空的序列。这些空行在语义上是正确的(根据 SQL/XML 标准),如果按这种方式编写查询,则必须返回它们。
该查询的性能并不好。首先,不能使用/customerinfo/phone 上的索引,因为查询不允许排除行。其次,返回很多空行使查询速度不必要地慢了下来。
为了解决性能问题并 得到所需的输出,应该在select 子句中使用XMLQUERY函数,只提取客户姓名,将应该排除行的搜索条件转移到 where 子句的XMLEXISTS 谓词中。这将允许使用索引和对行进行过滤,还可以避免空结果行带来的开销。像下面这样编写查询:
select xmlquery('$i/customerinfo/name' passing info as "i")
from customer
where xmlexists('$i/customerinfo[phone = "905-555-4789"]' passing info as "i")
<name>Matt Foreman</name> |
1 record(s) selected
总而言之,XMLQUERY函数中的谓词只应用于每个 XML 值当中,所以它们不会排除任何行。文档过滤和行过滤谓词应该放入到 XMLEXISTS函数中。
提示10:使用方括号 [ ]来避免 XMLEXISTS中的Boolean 谓词
一种常见的错误是在XMLEXISTS函数中不使用方括号来编写前面的查询:
select xmlquery('$i/customerinfo/name' passing info as "i")
from customer
where xmlexists('$i/customerinfo/phone = "905-555-4789"' passing info as "i")
这将产生以下结果:
<name>Matt Foreman</name> |
<name>Peter Jones</name> |
<name>Mary Poppins</name> |
3 record(s) selected
- ››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 数据模型
更多精彩
赞助商链接