2016-08-05 13 views
0

私はこのXQueryを持っている:のXQuery最適化

declare variable $i := doc()/some-element/modifier[empty(modifier-value)]; 
$i[1]/../..; 

私たちは721170811のレコードを持っているMarklogicのQconsoleにこのクエリを実行する必要があります。それは膨大なレコード数なので、タイムアウトエラーが発生しています。結果を得るためにこのクエリを最適化する方法はありますか?

P.S.タイムアウト時間を増やすようにamdinに要求することはできません。

答えて

2

要素範囲インデックス(またはターゲット要素が一意でない場合はパス範囲インデックス)を作成し、cts:values()レキシコンルックアップを使用してみてください。

このようにして、要求は各ドキュメントを読み取るのではなく、範囲インデックスから値を読み取ることができます。

参照:卵を、あなたは、クエリを作成したドキュメントを取得し、反復ごとに1000の文書を収集し、結果を反復処理し、別のxdmpを呼び出す際にライブラリを作成します:あなたはxdmp使用することができ

http://docs.marklogic.com/guide/search-dev/lexicon

+0

私は管理者に私の最後からそのコードを最適化できる方法はありませんか? – Sujan

+0

7億件のドキュメントでは、クエリを頻繁に実行する必要がある場合は、管理者に範囲インデックスを追加することをお勧めします。そうでない場合は、cts:uris()関数を使用して、いくつかの要素の基準をcts:クエリとして渡して、クライアントで文書urisを収集します。次に、ページのurisのリストを繰り返して、一度に1ページのドキュメントから値を取得します。 REST APIの値のエンドポイントを使用して、cts:queryおよびREST APIドキュメントエンドポイントをトランスフォームで実行して値を抽出することができます。 – ehennum

0

産卵

xdmp:spawn("process.xqy") 

:そのデータセットからの情報を処理するために、私は次のようになりますあなたが最後に、ブラウザをクラッシュしていないする必要がありますだけの情報を返すように結果をまとめることをお勧めライブラリprocess.xqy

function local:start-process(){ 
    let $docs := (....) 
    let $temp := for $x in $docs[$start to $end] 
       return local:process-dataset($temp) (: Could use spawn here too if you want :) 
    return xdmp:spawn("collect.xqy",$temp) 
} 

local:start-process() 

コンパクトなデータ機能は、あなたのデータを含むファイルまたはファイルのセットを作成する必要があり、この方法は、サーバーは、すべてのプロセスを実行すると、いくつかの数分で、あなたのデータを見て利用できるようになります問題なく。

0

doc()またはxdmp:directoryのようなものを実行したくない場合は、毎回あなたを殺す結果セットを返すだけです。結果セットをたくさん減らす必要があります。

いくつかの考え:

  1. あなたが同じくらいMarkLogicのd-nodeで行っているにしたい、と少なくとも作業が可能とe-nodeで行います。これはやり過ぎの一般化ですが、大部分はd-nodeのようなものはデータ、インデックス、辞書作業などです。e-node stuffはxQueryなどを処理します。したがって、あなたの例では、間違いなくあなたが必要以上にe-nodeを解決しています。

  2. cts:searchは、xPathではなくインデックスを使用しているため、クエリを解決するために使用します。したがって、このような何か:

    declare variable $i := cts:search(fn:collection(), 
        cts:element-query(xs:QName("some-element"), 
        cts:element-value-query(xs:QName("modifier"), "", "exact") 
    ) 
    )[1]; 
    

は、これはあなたが$i[1]/../..に欠けていたもののように見えた、document-node年代を返します。これはxPath some-elementを検索して、空のmodifierを探します。

0

要素範囲のインデックスと属性範囲のインデックスを作成し、marklogicに慣れている場合はcts:searchを使用してください。クエリを書くのは簡単です。