2

これが私の例です。たとえば、500.000エントリの非常に大きなXMLファイルがある場合、次のようになります。

<entries>
  <entry id="1">...</entry>
  <entry id="2">...</entry>
  <entry id="3">...</entry>
  ...
  <entry id="500000">...</entry>
</entries>

ただし、IDが間にあるエントリ(たとえば、500と1000など)のみを保持したいのです。もちろん、次のようにします。

let $entries := //entry[(xs:integer(./@id) >= 500) and (xs:integer(./@id) <= 1000)]

しかし、私はこのリクエストで、エントリー#1000から500.000までを探し続けるつもりだと思います。このエントリ#1000に到達したときにシークを停止する方法ですか?

4

2 に答える 2

1

コメントでeXist-dbを使用していることに気付いたので、eXist-db固有のガイダンスをいくつか提供しましょう。

  1. subsequence()関数は、大なり/小なりメソッドよりも優れたパフォーマンスを発揮します。これに関する議論については、eXist-dbメーリングリストのこのWolfgang Meierの投稿を参照してください。件名は、「高速ページングのための位置述語の最適化」です:http: //markmail.org/message/aoe5wmy2gmf3aaqh。だからあなたの場合:

    let $entries := subsequence(//entry, 500, 500)
    

    これにより、エントリ500〜1000が取得されます。

  2. 比較クエリ(より大きい/より小さい)を実行する必要がある場合は、@idに範囲インデックスを追加することをお勧めします。範囲インデックスとその設定方法の詳細については、範囲インデックスに関するeXist-dbドキュメントページ(http://exist-db.org/exist/apps/doc/indexing.xml#rangeidx )を参照してください。

eXist-dbメーリングリストに気軽に参加してください。クエリのパフォーマンスを最適化する方法については、いつでも喜んでご相談させていただきます。https://lists.sourceforge.net/lists/listinfo/exist-openで参加するか、 http://exist.markmail.org/でアーカイブを検索してください。

于 2012-12-25T06:02:03.757 に答える
1

entry要素が(提供されたドキュメントのように)属性でソートされているように見える場合id、ほとんどのXPath(およびXQuery)実装はこれを効率的に評価する必要があります

/*/entry[position() le 1000 and position() ge 500]
于 2012-12-25T00:13:38.770 に答える