[英]BaseX: Slow XQuery
我有一个带有约20个XML文件的BaseX XML数据库。 这些文件的大小和结构不同。 最大的文件有524 MB。 它由一个带有267685个ART子标签的父ARTICLE标签组成。
这是我的XQuery:“ / ARTICLE / ART [PRDNO = 12345]”(非常简单;为清楚起见,省略了适当的名称空间)。 PRDNO是PRODUCT / PRD XML结构的外键,每篇文章有多个(平均约10个)产品。
一切都按预期进行,但此查询的速度很慢-执行大约需要1秒。 对数据库中其他对象(数据量较小)的类似查询要快得多。
我该怎么做才能优化此查询?
我运行了“优化”(花了几分钟),确保已建立TEXT索引。
这是“信息数据库”的输出:
> info database
Database Properties
Name: hospindex
Size: 1740 MB
Nodes: 69360063
Documents: 22
Binaries: 0
Timestamp: 2014-09-03-09-34-07
Resource Properties
Timestamp: 2014-09-03-09-21-14
Encoding: UTF-8
CHOP: true
Indexes
Up-to-date: true
TEXTINDEX: true
ATTRINDEX: true
FTINDEX: false
LANGUAGE: English
STEMMING: false
CASESENS: false
DIACRITICS: false
STOPWORDS:
UPDINDEX: false
MAXCATS: 100
MAXLEN: 96
编辑 :这是查询执行计划:
Compiling:
- adding text() step
Query:
/*:ARTICLE/*:ART[*:PRDNO=1005935]
Optimized Query:
(db:open-pre("hospindex",0), db:open-pre("hospindex",32884731), ...)/*:ARTICLE/*:ART[(*:PRDNO/text() = 1005935)]
Result:
- Hit(s): 1 Item
- Updated: 0 Items
- Printed: 2078 Bytes
- Read Locking: local [hospindex]
- Write Locking: none
Timing:
- Parsing: 1.12 ms
- Compiling: 0.46 ms
- Evaluating: 1684.35 ms
- Printing: 0.35 ms
- Total Time: 1686.3 ms
Query plan:
<QueryPlan>
<IterPath>
<DBNodeSeq size="22">
<DBNode name="hospindex" pre="0"/>
<DBNode name="hospindex" pre="32884731"/>
<DBNode name="hospindex" pre="33685448"/>
<DBNode name="hospindex" pre="38260847"/>
<DBNode name="hospindex" pre="38358876"/>
</DBNodeSeq>
<IterStep axis="child" test="*:ARTICLE"/>
<IterStep axis="child" test="*:ART">
<CmpG op="=">
<CachedPath>
<IterStep axis="child" test="*:PRDNO"/>
<IterStep axis="child" test="text()"/>
</CachedPath>
<Int value="1005935" type="xs:integer"/>
</CmpG>
</IterStep>
</IterPath>
</QueryPlan>
当在搜索值周围使用引号时,您的查询将被更快地评估:
/ARTICLE/ART[PRDNO = "12345"]
原因是当前版本的BaseX不提供数值索引(它可能包含在BaseX 8.0中)。
通过打开QUERYINFO选项,您可以对查询编译步骤有更深入的了解。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.