BaseX(XQuery)中的Distinct-Nodes耗时太长

时间:2015-03-24 06:22:46

标签: xquery basex

我正在尝试获取大文件的所有不同的起始元素/products/p:category/start节点。我写了一个查询,如下所示。获得结果需要很长时间。我附加了查询信息和XML文件。

跑了几分钟后,我停止了执行。

查询正在尝试获取所有不同的start元素。有3种类别元素。

declare namespace functx = "http://www.functx.com";
declare namespace p="a:b:c";

declare function functx:is-node-in-sequence( 
  $node as node()? , 
  $seq as node()* 
)  as xs:boolean {
  some $nodeInSeq in $seq satisfies deep-equal($nodeInSeq,$node)
};

declare function functx:distinct-nodes( 
  $nodes as node()*
) as node()* {
  for $seq in (1 to count($nodes))
  return $nodes[$seq]
         [not(functx:is-node-in-sequence(.,$nodes[position() < $seq]))]} ;

let $diff_starts := functx:distinct-nodes(/products/p:category/start)
return $diff_starts 

如果您需要更多详细信息,请与我们联系。

xml file

1 个答案:

答案 0 :(得分:2)

将相当多的节点与FunctX提供的功能进行比较非常昂贵,远远超出与项目数量成线性关系的成本。

FunctX通常是一个整洁的库,但通常不能很好地扩展到大型数据(尽管XML数据库可以很好地处理更大的数据而没有问题)。

在此查询中,我首先获取线性时间中的所有不同值(在节点查找的数量中;用于获取不同的值BaseX uses a hashtable ),以及在所有节点上的另一个线性扫描以检索每个节点的第一个结果节点这些价值观。笔记本电脑的总执行时间约为700毫秒。

declare namespace p="a:b:c";
for $date in distinct-values(/products/p:category/start)
return (/products/p:category/start[. eq $date])[1]