【发布时间】:2021-06-23 18:04:26
【问题描述】:
我在多个级别执行连接时遇到了一个奇怪的性能问题,比如说我有一个巨大的 xml,我需要从中执行连接(在那个巨大的 xml 内的记录上,大约几千个)并定义 4 个层次结构级别(父级/儿童关系)。但是,三个级别的连接(每个级别一个连接)可以正常工作,但第四级连接需要几个小时才能完成。非常感谢任何输入和指导。谢谢。 例如:源 XML
<items>
<item>
<level>1</level>
<parentref></parentref>
<parentitem></parentitem>
<itemno>123</itemno>
<itemname>Laptop</itemname>
</item>
<item>
<level>2</level>
<parentref>1</parentref>
<parentitem>123</parentitem>
<itemno>111</itemno>
<itemname>Keyboard</itemname>
</item>
<item>
<level>2</level>
<parentref>1</parentref>
<parentitem>123</parentitem>
<itemno>112</itemno>
<itemname>Mouse</itemname>
</item>
<item>
<level>3</level>
<parentref>2</parentref>
<parentitem>112</parentitem>
<itemno>112-1</itemno>
<itemname>Fiber Mouse</itemname>
</item>
<item>
<level>4</level>
<parentref>3</parentref>
<parentitem>112-1</parentitem>
<itemno>112-2</itemno>
<itemname>Mouse Pad and USB</itemname>
</item>
</items>
预期输出:
<items>
<item>
<itemno>123</itemno>
<itemname>Laptop</itemname> -- Level 1 ( Top level always be one record)
<accessories> -------------------------------
<itemno>111</itemno>
<itemname>Keyboard</itemname> -- Both accessories belong to Level 2 ( can be any number of records)
</accessories> one of the accessories has two levels ( can be any number of records)
<accessories>
<itemno>112</itemno>
<itemname>Mouse</itemname>
<addons>
<itemno>112-1</itemno>
<itemname>Fiber Mouse</itemname>
<moreaddons> --- Performance issue is at this level of join
<itemno>112-2</itemno> For 500 addons records, I have almost 5000 moreaddons to match in my source xml.
<itemname>Mouse Pad and USB</itemname>
</moreaddons>
</addons>
</accessories>
</item>
我在下面使用的示例加入代码:
第 1 级:获取基础物品
for $x in input xml
where $x/level=1
第 2 级:获取给定基础项目的配饰
for $y in $x
for $i in input xml
where $i/level=2
and $y/itemno = $i/parentitem
第 3 级:获取给定配件的插件
let $p := (for $bv in $i return $bv)
let $lst := (for $id in input xml
where $ids/level=3 return $id)
return for-each($p,function($p){
if(for-each($lst,function($lst){$p/itemno=$lst/parentitem})=true()
then for $av in input xml
where $av/level = 3
and $av/parentitem=$p/itemno
第 4 级:获取给定插件的更多插件
let $q := (for $cv in $av return $cv)
let $lsts := (for $ids in input xml
where $ids/level=4 return $ids)
return for-each($q,function($q){
if(for-each($lsts,function($lsts){$q/itemno=$lsts/parentitem})=true()
then for $dv in input xml
where $dv/level = 4
and $dv/parentitem=$q/itemno
【问题讨论】:
-
XQuery sn-ps 是否不完整?我没有看到任何
else表达式,似乎有些函数体没有关闭。 -
对于高性能连接,您似乎希望在
item上为itemno和level建立一个索引。处理器是否识别或允许您声明它们取决于您使用的处理器。您使用哪种 XQuery 处理器? -
性能始终取决于 XQuery 实现,因此最重要的信息是告诉我们您使用的 XQuery 产品。
-
感谢您的宝贵意见@Martin 和 Michael。是的,Intentionllay 我删除了 else 部分,因为它不包含代码中的任何条件。我使用支持 Xquery 1.0 和 3.0 版本的 Saxon Xquery 处理器。我会尝试这些代码 sn-ps 并再次感谢你们。
-
在 Saxon 的情况下,了解哪个版本作为 Saxon EE(和 PE?)使用的查询优化器确实比 HE 更好。
标签: xml xslt xquery xquery-3.0