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