WEB开发网
开发学院数据库DB2 DB2 9中15个pureXML性能最佳实践 阅读

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

 2010-02-18 15:01:05 来源:WEB开发网   
核心提示:提示9:将文档过滤谓词放入XMLEXISTS中,而不是放入XMLQUERY中让我们来考虑下面的表和数据:create table customer(info XML);表 2. customer 表中的三行数据 <customerinfo>

提示9:将文档过滤谓词放入XMLEXISTS中,而不是放入XMLQUERY中

让我们来考虑下面的表和数据:

create table customer(info XML);

表 2. customer 表中的三行数据

<customerinfo>
  <name>Matt Foreman</name>
  <phone>905-555-4789</phone>
</customerinfo>
<customerinfo>
  <name>Peter Jones</name>
  <phone>905-123-9065</phone>
</customerinfo>
<customerinfo>
  <name>Mary Poppins</name>
  <phone>905-890-0763</phone>
</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

上一页  1 2 3 4 5 6 7 8  下一页

Tags:DB pureXML 性能

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接