[英]XQuery performance
我使用手写笔工作室(带有DATA DIRECT)/ xQuery将两个xmls文件合并为一个(文件先从CSV转换为xml,然后再合并)。 首先读取客户(标头)数据,然后为每个客户读取匹配的交易数据。 (使用循环)交易数据也按交易日期(年)分组。 这是通过使用不同的功能来完成的。 交易数据文件很大,处理起来很慢。 我正在寻找提高性能的方法。 任何帮助。 的建议很感激。 下面是使用的代码。 谢谢。
(:options:)
declare option ddtek:xml-streaming "yes";
declare option ddtek:serialize "encoding=UTF-8,
omit-xml-declaration=no, indent=yes";
(:external variables:)
declare variable $esa-h-converter as xs:string external;
declare variable $esa-t-converter as xs:string external;
declare variable $input-h-data-path as xs:string external;
declare variable $input-t-data-path as xs:string external;
(:main:)
<ROOT_NODE>
{
let $heads := doc(fn:concat(
"converter:",
$esa-h-converter,
"?file:///",
$input-h-data-path))
/DATA_ROOT/CUSTOMER
for $record at $primaryKey in $heads
return
<TEMPLATE>
<CUSTOMER>
<RECORD_COUNT>{ $primaryKey }</RECORD_COUNT>
<HD_REGION>{ $record/HD_REGION/text() }</HD_REGION>
<HD_CONT>{ $record/HD_CONT/text() }</HD_CONT>
<HD_FRDATE>{ $record/HD_FRDATE/text() }</HD_FRDATE>
<HD_TODATE>{ $record/HD_TODATE/text() }</HD_TODATE>
<HD_CUSNAME>{ $record/HD_CUSNAME/text() }</HD_CUSNAME>
<HD_ADDR1>{ $record/HD_ADDR1/text() }</HD_ADDR1>
<HD_ADDR2>{ $record/HD_ADDR2/text() }</HD_ADDR2>
<HD_ADDR3>{ $record/HD_ADDR3/text() }</HD_ADDR3>
<HD_ADDR4>{ $record/HD_ADDR4/text() }</HD_ADDR4>
<HD_STATE>{ $record/HD_STATE/text() }</HD_STATE>
<HD_SUBTOWN>{ $record/HD_SUBTOWN/text() }</HD_SUBTOWN>
<HD_PCODE>{ $record/HD_PCODE/text() }</HD_PCODE>
{
let $my-transactions :=
doc(fn:concat("converter:",
$esa-t-converter,
"?file:///",
$input-t-data-path))
/DATA_ROOT
/TRANSACTION
[TR_CONT eq $record/HD_CONT
and TR_REGION eq $record/HD_REGION]
let $years := fn:distinct-values(
$my-transactions
/fn:substring(TR_DATE/text(), 1, 4))
for $period in $years
return
<PERIOD>
<RECORD_COUNT>{ $primaryKey }</RECORD_COUNT>
<YEAR>{ $period }</YEAR>
{
$my-transactions
[fn:substring(TR_DATE/text(), 1, 4) = $period]
}
</PERIOD>
}
</CUSTOMER>
</TEMPLATE>
}
</ROOT_NODE>
性能通常在很大程度上取决于单个产品和特定数据,因此,在获得建议之前,请先花点力气,并在相信之前自己进行测试。 我希望比我更熟悉Data Direct处理器的人能够解决您的问题。 但话虽如此,我想到了几件值得尝试的事情:
您可以先尝试按客户对交易文件进行排序,然后再执行合并。 如果事务文件很长,排序将不会很快。
您可以(根据客户组织的交易文件)访问交易文件中的每个客户并执行合并,而不是访问主文件中的每个记录并为其查找交易。
您内部的FLWOR表达式在整个事务文件中进行了两项选择,涉及到查看fn:substring(TR_DATE/text(), 1, 4)
-这似乎很可能使几乎所有XQuery引擎的优化器失败。 如果引擎已建立日期索引,则查看子字符串可确保查询处理器无法对值进行简单的索引查找,但必须扫描索引中的所有值(或文档中可能的所有值) )进行匹配。
既然您说您正在为两个文件创建XML,所以我想您可以提取年份子字符串并将其(冗余地)放在单独的元素或属性中。 原则上,这将使XQuery引擎可以建立索引并使用索引查找而不是扫描来执行选择的那部分。 (我不知道这是否对您的特定处理器有所帮助。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.