2017-09-26 10 views
0

こんにちは私はC++でBaseXを扱い、クエリーのパフォーマンスに問題があります。私はmannyのXMLファイルを持つデータベースを持っていますが、例えば、そのように見えるcsvファイルからインポートされたXMLファイルが1つあります。BaseX Xqueryの最適化

<record> 
    <hsn>0005</hsn> 
    <tsn>486</tsn> 
    <factorycode>BMW 3/1</factorycode> 
    <description>318I</description> 
    <power>83</power> 
    <cubiccapacity>1796</cubiccapacity> 
    <typeapprovaldate>19910701</typeapprovaldate> 
    <xxx>1</xxx> 
    <mid>BMW00737</mid> 
</record> 

私は同じHSNとすべての半ばを探し、単純なクエリ文を持っており、TSN

for $mid in doc('database')//record 
where $mid/hsn = '0005' and $mid/tsn = '404' 
return $mid/mid 

問題は、xmlファイルは、多くのレコードを含んでいるので、それは長い間にかかることです。

クエリまたはxmlファイルを最適化する方法はありますか? アトリビュートインデックスは機能すると思いますが、データベースでどのように使用するのか分かりません。http://docs.basex.org/wiki/Indexes

+0

引用したWikiの記事に記載されているように、Info Viewの出力を確認しましたか? –

答えて

0

まず、「長く」と何個のレコードを保管していますか?長すぎると秒数または分が多すぎることがあります。長すぎると50msを意味する可能性があります。質問をするときは、より具体的にしてください。

次に、xmlに属性がないため、必ず属性インデックスを使用しないでください。 テキストインデックスを使用します。通常、この場合はテキスト・インデックスを使用するようにオプティマイザでクエリを書き直す必要がありますが、BaseX GUIの「クエリ情報」ビューを確認することはできます。コンパイルのステップと最適化されたクエリでは、インデックスが使用されるエントリが表示されます。何も表示されない場合は、何らかの理由でオプティマイザが索引を作成していないか、またはおそらく索引が最新でないと判断したため、索引は使用されません。 db:textを直接使用できます。

しかし、私はあなたに2つの無関係なヒントを教えてください。パフォーマンスの問題がある場合は、最初に//を使用しないでください。それは子孫または自己のステップであり、BaseXがすべての子孫要素を調べなければならないことを意味します。代わりに、特定のパス、つまりdoc('database')/records/recordを使用します。

さらに、$mid/hsnも書き込まないでください。有効かもしれないが、パス演算子の間に空白を入れることは非常に慣習的ではない。代わりに、空白を削除して$mid/hsnと書いてください。