WEB开发网
开发学院数据库DB2 DB2 最佳实践: 使用 DB2 pureXML 管理 XML 数据的... 阅读

DB2 最佳实践: 使用 DB2 pureXML 管理 XML 数据的最佳实践,第 3 部分:如何高效并有效率的查询 XML 数据

 2009-11-12 00:00:00 来源:WEB开发网   
核心提示: 清单 27 中的查询连接了 PARTIES 和 TRADES 表的 XML 列,以返回这个交易中各方的实际名字,DB2 最佳实践: 使用 DB2 pureXML 管理 XML 数据的最佳实践,第 3 部分:如何高效并有效率的查询 XML 数据(10),为了可以使用 SELECT DISTINCT

清单 27 中的查询连接了 PARTIES 和 TRADES 表的 XML 列,以返回这个交易中各方的实际名字。为了可以使用 SELECT DISTINCT 和消除重复的交易方名字,结果值被输出成一个 SQL VARCHAR 类型。


清单 27. 用 SQL/XML 连接 XML 数据
select distinct xmlcast(xmlquery('$PARTYINFO/Party/Name')as varchar(30)) 
 from parties p, trades t 
 where XMLEXISTS('$PARTYINFO/Party[PtyID = $TRADEDOC/FpML/party/partyId]');

在普通 XQuery 也可以用两个嵌套的 FOR 子句表达相同的连接。你可以直接把它们想成在两个表之间的一个嵌套循环连接。


清单 28. 在两个 XML 文档之间的连接
XQUERY distinct-values( 
 for $tdoc in db2-fn:xmlcolumn("TRADES.TRADEDOC")/FpML 
  for $pty in db2-fn:xmlcolumn("PARTIES.PARTYINFO")/Party 
 where $tdoc/party/partyId=$pty/PtyID 
 return $pty/Name);

在 XQuery 和 SQL/XML 查询中正确使用 * 和 //

通配符 * 和 // 在使用的时候需要小心,因为它们可能有性能影响并可能返回相当多的结果。无论你使用 XQuery 还是 SQL/XML 都会有很多不同的路径表达,这可能获取到期时间或某个交易的的本金总数。例如,/FpML/trade/termDeposit/principal /amount 和 //principal/amount 返回定期存款交易的本金总数。

为了获得最佳性能,比起 * 或 //,最好使用全路径,因为 DB2 可以跳过这个文档不相关的部分直接访问想要的元素。如果你用 //amount 替换 /FpML/trade/termDeposit/principal/amount,你访问的将是在这个文档中的所有“ amount ”元素。这需要 DB2 访问文档中的每一个分支,每一层的 principal/amount 元素,而这本是可以避免的开销。

上一页  5 6 7 8 9 10 

Tags:DB 最佳 实践

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