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

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

 2010-02-18 15:01:05 来源:WEB开发网   
核心提示:XMLEXISTS 谓词中的表达式使 XMLEXISTS 总是为true,因此,DB2 9中15个pureXML性能最佳实践(6),没有行被排除,这是因为,较好的做法是将SQL/XML 发布函数藏在一个视图定义中,使应用程序和其他查询可以从视图中选择构造好的XML 文档,对于一个给定的行,只有当里面的XQuery 表达

XMLEXISTS 谓词中的表达式使 XMLEXISTS 总是为true。因此,没有行被排除。这是因为,对于一个给定的行,只有当里面的XQuery 表达式返回空序列时,XMLEXISTS 谓词才为false。然而,如果不使用方括号,XQuery 表达式就是一个总是返回 Boolean 值的Boolean 表达式,而不会返回空序列。注意,XMLEXISTS 只是检查一个值的存在,如果存在一个值,即使这个值碰巧为Boolean 值 “false”,XMLEXISTS 也将返回 true。虽然这并不是您想实现的效果,但是根据 SQL/XML 标准,这的确是正确的行为。

同样,其影响是不能使用phone 上的索引,因为没有行被排除,所以会收到大量不需要的行。而且,在使用两个或更多谓词时,不要犯同样的错误,例如在下面这个查询中:

清单 6. XMLEXISTS中两个谓词的不恰当的使用

select xmlquery('$i/customerinfo/name' passing info as "i")
from customer
where xmlexists('$i/customerinfo[phone = "905-555-4789"] and
     $i/customerinfo[name = "Matt Foreman"]'
   passing info as "i")

这个查询使用了方括号,那么它错在哪里呢?XQuery 表达式仍然是一个 Boolean 表达式,因为它的形式是“exp1 and exp2”。下面是编写这个查询的正确方式,这样编写查询可以过滤行,并允许使用索引:

清单 7. 可以过滤行并允许使用索引的正确查询

select xmlquery('$i/customerinfo/name' passing info as "i")
from customer
where xmlexists('$i/customerinfo[phone = "905-555-4789" and name = "Matt Foreman"]'
   passing info as "i")

总而言之,在XMLEXISTS中不要使用Boolean 谓词。将谓词放在方括号中,包括任何 “and”和 “or”。

提示11:使用RUNSTATS 收集 XML数据和索引的统计信息

RUNSTATS 实用程序已经被扩展,现在可以收集关于XML数据和 XML 索引的统计信息。DB2 基于成本的优化器使用这些统计信息为XQuery和 SQL/XML 查询生成有效的执行计划。因此,像对待关系数据那样,继续使用RUNSTATS。如果表包含关系数据和 XML数据,而您又只想刷新关系数据的统计信息,那么可以带新的子句 “EXCLUDING XML COLUMNS”来执行RUNSTATS。如果没有这个子句,缺省的也是可取的行为是总是收集关系数据和 XML数据的统计信息。

对于关系数据和 XML数据,可以启用抽样(sampling)来减少执行runstats的时间。在一个大型的数据集上,10%的数据(或者更少)的统计信息通常仍然非常具有代表性。无论选择多大的抽样百分比,runstats 允许对行(Bernoulli sampling)或页面(system sampling)进行抽样。行级的抽样读取所有数据页,但是只考虑每页上一定百分比的行。而页级的抽样则可以显著减少 I/O,因为它只读取一定百分比的数据页。因此,如果表中不仅包含 XML数据,而且还包含相当数量的关系数据,页抽样可以显著提高性能。但是,如果关系数据值是高度聚集的,那么行级抽样可以产生更精确的统计信息。

下面是一些例子。第一个 runstats 命令为表 customer和它的所有索引收集最全面、最详细的统计信息,而没有采用抽样。如果执行时间允许的话,这样做是理想的。第二个命令收集同样的统计信息,但是只收集 10%的页面的统计信息。在很多情况下,这样做可以为优化器提供接近于第一个命令的精确性的统计信息,但是可以更快地返回结果。第三个命令抽取 15%的行,但是不收集分布统计信息,并对索引也应用了抽样,这不同于第一个命令和第二个命令。

清单 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;

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

Tags:DB pureXML 性能

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