与几乎相同的XQuery(exists-db)interogations在速度上存在巨大差异

时间:2018-03-08 13:15:16

标签: xquery exist-db

过去几周我一直在移植一个SQL数据库,虽然我到目前为止设法克服了以前所有的障碍,但我现在遇到的东西都没有官方文档,在线搜索,也没有常识能够提供帮助。

简而言之,我有一个非常大的集合(大约90k条目,分布在20个文件中),大多数单独的条目看起来像这样(这是一个大规模的简化,所以我可以得到重点):

<document>
 <document_id>Numerical Value</document_id>
 <page_id>Some other numerical value</page_id>
</document>

然后我通过php传递一个值,让我们称之为$val 奇怪的是,当我运行标准查询时

$p in collection("/db/folder_location")//documentset/document[xs:integer(document_id) eq $val]

无论我传递什么值,它都会在几秒钟内返回所有结果。但是,如果我略微修改它,那么:

$p in collection("/db/folder_location")//documentset/document[xs:integer(page_id) eq $val]

要么返回值要么花费超过30秒,要么只是在正在运行的查询中保持锁定状态,并且永远不会返回任何内容。在我已经转换的所有30个查询中,这是我遇到此问题并且找不到解决方法的唯一一次。

1 个答案:

答案 0 :(得分:0)

要解决查询性能问题,我建议您对查询进行一些更改和/或在document_idpage_id元素上添加范围索引。

您的查询会将所有document_idpage_id个元素投射为xs:integer。考虑到大型数据集,这是一种低效的操作。考虑(a)删除此类型转换,(b)将其反转(将$val转换为xs:string),或(c)使用type="xs:integer"在这两个元素上添加范围索引。后一个选项将允许您删除谓词中的强制转换(允许您将其更改为document[document_id eq $val]document[page_id eq $val]),索引应该可以大大加快查找速度。

要为查询添加范围索引,请创建一个集合配置文档,如下所示:

<collection xmlns="http://exist-db.org/collection-config/1.0">
    <index xmlns:xs="http://www.w3.org/2001/XMLSchema">
        <range>
            <create qname="document_id" type="xs:integer"/>
            <create qname="page_id" type="xs:integer"/>
        </range>
    </index>
</collection>

如果您的数据位于/db/folder_location,请将此文档作为collection.xconf存储在/db/system/config/db/folder_location中。然后使用xmldb:reindex("/db/system/config/db/folder_location")重新编制您的收藏集。正如关于范围索引的文档所述,使用此索引定义:

  

索引将自动用于常规或值比较以及fn:containsfn:starts-withfn:ends-with等字符串函数。

有关eXist中范围索引的更多信息,请参阅https://exist-db.org/exist/apps/doc/newrangeindex.xml。有关查询优化技术,请参阅https://exist-db.org/exist/apps/doc/tuning.xml。对于eXist中的一般索引,请参阅https://exist-db.org/exist/apps/doc/indexing.xml