2

这是我的示例:例如,如果我有一个包含 500.000 个条目的非常大的 XML 文件,如下所示:

<entries>
  <entry id="1">...</entry>
  <entry id="2">...</entry>
  <entry id="3">...</entry>
  ...
  <entry id="500000">...</entry>
</entries>

但我只想保留 id 介于两者之间的条目,例如 500 和 1000。当然我会这样做:

let $entries := //entry[(xs:integer(./@id) >= 500) and (xs:integer(./@id) <= 1000)]

但我想通过这个请求,我将通过 500.000 个条目继续寻找 #1000 条目。当我到达此条目 #1000 时,这是一种停止搜索的方法吗?

4

2 回答 2

1

如果entry元素按其id属性排序(如在提供的文档中),大多数 XPath(和 XQuery)实现应该有效地评估这一点

/*/entry[position() le 1000 and position() ge 500]
于 2012-12-25T00:13:38.770 回答
1

由于您在评论中指出您正在使用 eXist-db,因此让我提供一些 eXist-db 特定的指导:

  1. subsequence() 函数将比大于/小于方法执行得更好。有关这方面的讨论,请参阅 Wolfgang Meier 在 eXist-db 邮件列表上的帖子,主题为“优化位置谓词以进行快速分页”: http: //markmail.org/message/aoe5wmy2gmf3aaqh。所以在你的情况下:

    let $entries := subsequence(//entry, 500, 500)
    

    这将为您提供 500-1000 个条目。

  2. 如果您确实需要进行比较查询(大于/小于),您可能需要在 @id 上添加范围索引。有关范围索引以及如何设置它们的更多信息,请参阅范围索引的 eXist-db 文档页面:http: //exist-db.org/exist/apps/doc/indexing.xml#rangeidx

请随时加入 eXist-db 邮件列表;我们总是很乐意讨论优化查询性能的方法。在https://lists.sourceforge.net/lists/listinfo/exist-open加入,或在http://exist.markmail.org/搜索档案。

于 2012-12-25T06:02:03.757 回答