DB2 9中15个pureXML性能最佳实践
2010-02-18 15:01:05 来源:WEB开发网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;
- ››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 数据模型
更多精彩
赞助商链接