首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XQuery优化低效查询策略(在eXist-db中)

XQuery优化低效查询策略(在eXist-db中)
EN

Stack Overflow用户
提问于 2018-11-02 03:04:21
回答 1查看 73关注 0票数 0

环境: eXist-DB 4.4 / Xquery 3.1

我有成百上千个tei:xml文档,其中编码了命名实体persNameplaceName。文档在

代码语言:javascript
复制
 collection("db/fooapp/data")

persNameplaceName的每个实例都有一个属性@nymRef,该属性包含引用主文档中的xml:id的单个值:

代码语言:javascript
复制
 db/fooapp/data/codes_persons.xml

 db/fooapp/data/codes_places.xml

这些主文档包含每个人或每个地方的规范名称。

我经常对某个名称进行单一查找,例如

代码语言:javascript
复制
let $x := some @nymRef

let $y := doc(db/fooapp/data/codes_places.xml)//tei:place[@xml:id=$x]//tei:placeName/text()

return $y

但是,有时候我需要这样做,遍历巨大的列表。例如,在所有文档中,我需要输出一个segid,它有一个(或多个)子元素placeName/@nymRef

代码语言:javascript
复制
 <seg xml:id="fooref">some text<placeName nymRef="fooplace"/>some text</seg>

任务是获取所有seg/@xml:id,然后查找并输出其下任何placeName/@nymRef的规范名称。这导致了大量的往返,效率非常低,但我不知道在eXist-DB中有任何其他方法可以做到这一点。昂贵的往返行程在let $c中表示,循环通过return

代码语言:javascript
复制
let $coll := collection("db/fooapp/data")

for $a in $coll//seg

    for $b in $a//placeName

        let $c := $doc("db/fooapp/data/codes_places.xml")//tei:place[@xml:id=$b/data(@nymRef)]//tei:placeName/text()

        return 
              <tr>
                <td>{$a/@xml:id}</td>
                <td>{$c}</td>
              </tr>

对于单个表输出,这可能会增加数百次往返。

如果有必要,我不反对将任务重组为多个功能。

在此之前,非常感谢您。

EN

回答 1

Stack Overflow用户

发布于 2018-11-02 19:51:25

请为我们提供输入xml和所需的输出,否则将无法重写查询。我们还需要查看您的索引配置。

一些一般性的建议,以避免往返:

  • 首先,请参阅my previous answer来回答您关于ft:query()的使用问题。当使用索引查找存在时,或者您强制它进行字符串比较而没有在string?
  • id()上配置索引时,values
  • distinct-values是可能的最快查找方法,它是您的朋友,只查找每个不同的键:值对一次。
  • 使用单个[@xml:id=$b/data(@nymRef)]循环来避免多次迭代相同的数据。
  • 尽可能使用限制性更强的XPath表达式,//可能会将大量不必要的数据加载到内存中。

所有这些甚至更多内容都可以在documentation中找到

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53107767

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档