过去几周我一直在移植一个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个查询中,这是我遇到此问题并且找不到解决方法的唯一一次。
答案 0 :(得分:0)
要解决查询性能问题,我建议您对查询进行一些更改和/或在document_id
和page_id
元素上添加范围索引。
您的查询会将所有document_id
和page_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:contains
,fn:starts-with
,fn: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。