几年前,我们在使用XQuery时遇到了问题。看这里: BaseX: Slow XQuery 我们能够在社区的帮助下解决该问题(索引正常运行所需的字符串文字)。但是现在(突然)同样的查询又变慢了!
查询xquery /*:ARTICLE/*:ART[*:PRDNO='1104423']
约需3-30秒(XML文件约为500MB),与xquery count(/*:ARTICLE/*:ART[*:PRDNO='1104423'])
相同。
来自info database
的结果令人怀疑,其中有一个文本索引。
我将“ QUERYPLAN”,“ XMLPLAN”和“ COMPPLAN”设置为true。
这为“计数”查询提供了以下内容:
Query plan:
<QueryPlan compiled="true">
<FnCount name="count(items)">
<IterPath>
<Root/>
<IterStep axis="child" test="*:ARTICLE"/>
<IterStep axis="child" test="*:ART">
<CmpG op="=">
<CachedPath>
<IterStep axis="child" test="*:PRDNO"/>
</CachedPath>
<Str value="1104423" type="xs:string"/>
</CmpG>
</IterStep>
</IterPath>
</FnCount>
</QueryPlan>
Query:
count(/*:ARTICLE/*:ART[*:PRDNO='1104423'])
Parsing: 0.21 ms
Compiling: 0.27 ms
Evaluating: 28453.24 ms
Printing: 0.15 ms
Total Time: 28453.87 ms
Hit(s): 1 Item
Updated: 0 Items
Printed: 1 b
Read Locking: hospindex
Write Locking: (none)
Query executed in 28453.87 ms.
类似地,这就是我在没有“ count”的情况下得到的查询结果:
Query plan:
<QueryPlan compiled="true">
<IterPath>
<Root/>
<IterStep axis="child" test="*:ARTICLE"/>
<IterStep axis="child" test="*:ART">
<CmpG op="=">
<CachedPath>
<IterStep axis="child" test="*:PRDNO"/>
</CachedPath>
<Str value="1104423" type="xs:string"/>
</CmpG>
</IterStep>
</IterPath>
</QueryPlan>
Query:
/*:ARTICLE/*:ART[*:PRDNO='1104423']
Parsing: 0.02 ms
Compiling: 0.01 ms
Evaluating: 0.49 ms
Printing: 20093.88 ms
Total Time: 20094.41 ms
Hit(s): 1 Item
Updated: 0 Items
Printed: 1583 b
Read Locking: hospindex
Write Locking: (none)
Query executed in 20094.41 ms.
有趣的是,“打印”时间非常长,但是打印结果只有几行。
我们已经重新创建和优化了数据库。
查询计划看起来就像是在使用索引,对吧?
有什么建议吗?非常感谢你!