首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BaseX:慢XQuery

BaseX:慢XQuery
EN

Stack Overflow用户
提问于 2014-09-03 07:39:13
回答 1查看 733关注 0票数 0

我有一个包含20个XML文件的BaseX XML数据库。这些文件的大小和结构不同。最大的文件有524 MB。它由一个带有267685个艺术子标签的父项目标签组成。

这是我的XQuery:“//ARTPRDNO=12345”(非常简单;为了清晰起见省略了正确的名称空间)。PRDNO是产品/PRD XML结构的外键,每篇文章有多个产品(平均10个)。

所有的事情都像它应该的那样工作,但是这个查询非常慢--大约需要1s才能执行。对数据库中的其他对象(数据量较小)的类似查询要快得多。

我能做些什么来优化这个查询?

我运行“优化”(这需要一些分钟),我确保文本索引到位。

这是“信息数据库”的输出:

代码语言:javascript
复制
> 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

编辑:这是查询执行计划:

代码语言:javascript
复制
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>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-03 08:42:20

当在搜索值周围使用引号时,您的查询将得到更快的评估:

代码语言:javascript
复制
/ARTICLE/ART[PRDNO = "12345"]

原因是当前版本的BaseX没有提供数值索引(它可能包含在BaseX 8.0中)。

通过打开奎尔选项,您可以更深入地了解查询编译步骤。

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

https://stackoverflow.com/questions/25638816

复制
相关文章

相似问题

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