2011-09-15 33 views
2

XQueryのパフォーマンスに関する質問があります。誰かが助けてくれることを願っています。XQueryのパフォーマンス - 答えに順序がありませんか?

下記のコードは問題なく動作していますが、可能であれば、パフォーマンスを改善したいと考えています。 - ヒットで見つかったprodname属性のすべての固有値を取得する 次に - ヒットで個々の値が何回出現するかを調べる - これらの別個の値をそれぞれの合計

時々、$ヒット数で12000個までのアイテムがありますので、プロセス全体に時間がかかることがあります。

私は、順序付けられていない式/関数を使用すると、パフォーマンスが大幅に向上する可能性があることを読んでいます。 私の質問は、以下のコードのパフォーマンスを向上させる方法があるかどうかです - 順序付けされていない、または他の方法で - そしてどのようなコーディング変更が必要なのでしょうか? 私はまだのXQueryオプティマイザは、一つの製品から別のものに非常に異なり、および技術は、パフォーマンスを向上させるために

let $tempResult := 
for $d in distinct-values($hits/ancestor-or-self::DOCUMENT/@prodname) 
    let $q := $hits/ancestor-or-self::DOCUMENT[@prodname = $d]  (: all the hits where prodname attribute has value of $d :) 
     order by $d 
     return <item zprodname="{$d}" zprodnamenum="{count($q)}"/> 

答えて

2

復帰のためのアルファ順に個別の値を保つように「順序$ dだけ」ラインを維持する必要がありますある製品では、別の製品とはかなり異なる場合があります。したがって、(a)あなたが使っている製品を知っていなくても、(b)その製品のオプティマイザについてのかなり詳細な知識がなければ、この質問に答えることはできません。

「順序付けられていない」がこのクエリのパフォーマンスに役立つ特別な理由はありませんが、見つけたい場合はそれを試してみてください。

このクエリを改善するためにまず行うべきことは、$ hits/ancestor-or-self :: DOCUMENT(またはおそらく$ hits/ancestor-or-self :: DOCUMENT/@ prodname)を変数に変換します。一部の製品に違いをもたらすかもしれないし、そうでないかもしれない。

残念ながら、XQuery 1.0では、この「入れ子ループ」スタイル以外のグループ化クエリを書くことはできません。実行することができない場合は、XSLT 2.0 xsl:for-each-group命令を使用することを検討してください。これは、あなたが望むものを正確に言っているだけでなく、データに対して1回のパスを求めているためです。

1

マイケルの指摘では、MarkLogicでは、数百万のアイテムが得られる可能性があり、カーディナリティが非常に低くなる可能性があるため、この問題を解決する方法があります。ここでは、MarkLogic拡張子を持つようになります。

「頻度順」はその頻度の順にアイテムを返しますが、あなたはその引数を省略し、バックスカラーの順序でそれらを得ることができる
for $d in cts:element-attribute-values(xs:QName("your-element"),xs:QName("prodname"),(),"frequency-order") 
return <item zprodname="{$d}" zprodnamenum="{cts:frequency($d)}"/> 

これは、ファセットナビゲーションの要望がある検索アプリケーションの共通のコーディングパターンです(日付ヒストグラムとファセットがこのアプローチを使用するXQueryベースの例については、www.markmail.orgを参照してください)。 MarkLogicに付属のSearchAPIには、この種のインターフェイス宣言を構築するためのコーディングのベストプラクティスが多数含まれています.XMLドキュメントで引数を指定するだけで、XQueryは適切なコード(上の例に似ています)とXMLペイロードが返されます。

関連する問題