BaseX: медленный XQuery

У меня есть база данных BaseX XML с ~ 20 файлами XML. Эти файлы различаются по размеру и структуре. Самый большой файл имеет размер 524 МБ. Он состоит из родительского тега ARTICLE с 267685 вложенными тегами ART.

Это мой XQuery: "/ ARTICLE / ART [PRDNO = 12345]" (довольно просто; правильные пространства имен опущены для ясности). PRDNO - это внешний ключ к структуре XML PRODUCT / PRD, в каждой статье содержится несколько (в среднем ~ 10) продуктов.

Все работает как положено, но этот запрос довольно медленный - на выполнение требуется примерно 1 с. Подобные запросы для других объектов в базе данных (где объем данных меньше) выполняются намного быстрее.

Что я могу сделать, чтобы оптимизировать этот запрос?

Я запустил «оптимизацию» (это заняло несколько минут), я убедился, что индекс ТЕКСТ на месте.

Это результат "информационной базы данных":

> 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>

person Matthias Wuttke    schedule 03.09.2014    source источник
comment
Что ж, я мог бы использовать другую базу данных XML или даже реляционную базу данных; но мне нравится BaseX из-за его простоты, и я бы хотел его придерживаться.   -  person Matthias Wuttke    schedule 03.09.2014
comment
Индекс атрибута активирован, это должно быть нормально. Не могли бы вы также сбросить план запроса? Он всегда отображается в графическом интерфейсе пользователя и может быть активирован с помощью параметра QUERYINFO в командная строка.   -  person Jens Erat    schedule 03.09.2014


Ответы (1)


Ваш запрос будет оцениваться намного быстрее при использовании кавычек вокруг вашего поискового значения:

/ARTICLE/ART[PRDNO = "12345"]

Причина в том, что текущая версия BaseX не предоставляет индекс числового значения (он может быть включен в BaseX 8.0).

Вы получите более полное представление об этапах компиляции запроса, включив параметр QUERYINFO.

person Christian Grün    schedule 03.09.2014
comment
Я видел, что вы только что добавили информацию о компиляции запроса. - person Christian Grün; 03.09.2014
comment
Большое тебе спасибо! Ошибка новичка. - person Matthias Wuttke; 03.09.2014