2011-10-28 8 views
0

今、私は大きな問題に直面しています。私はXQueryの新機能ですが、今はPHPとXSLTを使ってXqueryを使用しているプロジェクトに入っています。XQueryソートの問題

私たちのプロジェクトでは、データ(そのプロパティリストサイト)とそのデータをBarkeley DB(XML DB)に保存しています。 問題は、結果を得るのに時間がかかりすぎるプロパティを検索しているときです。 ORDER BYは問題(Query 1)を生成しています。正常に動作している(Query 2)。しかし、私のプロジェクトではソートが必要で、非常にインポテンツです。だから親切に私のクエリ(Query1)を確認し、私にできるだけ早く解決策を教えてください。次のクエリです:

Query1を:

 let $properties := (
      for $property in collection('bdb/properties.dbxml')/properties/property 
       [ (sale_price >=60000 and sale_price <=500000) and (building_square_footage >=300 and building_square_footage <=3000) and (bedrooms >=2 and bedrooms <=6) ] 
      order by 
       contains($property/mls_agent_id/text(), '505199') descending, 
       matches($property/mls_office_id/text(), '^CBRR') ascending, 
       $property/sale_price/number() descending 
      return $property 
     ) 

     let $properties := subsequence($properties,10,10) return <properties>{$properties}</properties> 

クエリ2:

let $properties := (
     for $property in subsequence (
      collection('bdb/properties.dbxml')/properties/property 
       [ (sale_price >=60000 and sale_price <=500000) and (building_square_footage >=300 and building_square_footage <=3000) and (bedrooms >=2 and bedrooms <=6) ] 
      , 1, 10) 
     ) 
     descending return $property 
    ) return <properties>{$properties}</properties> 
+0

*いくつかの*例のデータを、有効なXMLスニペットとして投稿することができますか? [要点](https://gist.github.com/)? –

答えて

0

ことができます場合、私は知らない..しかし、あなたがしようとすることで、より成功する可能性より高度なクエリ最適化を提供する代替XMLデータベースちょうど推測、Hannes

0

私は並べ替えはここで使用する間違ったツールだと思います。あなたは本当にエージェントのリスト、エージェントのリスト以外のオフィスのリスト、およびその他のリストの3つのリストを取得しています。これらの3つのクエリを作成するほうが効果的かもしれません。オプティマイザは各サブクエリのノードをより効率的に選択できます。役に立つかもしれ

let $properties := (
     for $property in collection('bdb/properties.dbxml')/properties/property 
      [ (sale_price >=60000 and sale_price <=500000) and (building_square_footage >=300 and building_square_footage <=3000) and (bedrooms >=2 and bedrooms <=6) and mls_agent_id = '505199'] 
     order by 
      $property/sale_price/number() descending 
     return $property, 
     for $property in collection('bdb/properties.dbxml')/properties/property 
      [ (sale_price >=60000 and sale_price <=500000) and (building_square_footage >=300 and building_square_footage <=3000) and (bedrooms >=2 and bedrooms <=6) and (starts_with(office_id, 'CBRR') and not(mls_agent_id = '505199'))] 
     order by 
      $property/sale_price/number() descending 
     return $property, 
     for $property in collection('bdb/properties.dbxml')/properties/property 
      [ (sale_price >=60000 and sale_price <=500000) and (building_square_footage >=300 and building_square_footage <=3000) and (bedrooms >=2 and bedrooms <=6) and not (starts_with(office_id, 'CBRR')] 
     order by 
      $property/sale_price/number() descending 
     return $property 
    ) 

    let $properties := subsequence($properties,10,10) return <properties>{$properties}</properties> 

他のものではなくmatchesstarts-withを使用して

  • 試みです​​ - 単純な文字列の一致があれば
  • を最適化するための正規表現よりも速く、かつ容易である可能性が高いです上記のように複数の選択肢に分割すると、すでに十分な項目が選択されていれば、2番目または3番目の選択を避けることができます。
  • <property>ノード全体を選択して、選択したもののほとんどをsubsequenceで破棄しないでください。特に並べ替えを行うと、メモリ帯域幅が大きくなる可能性があります。いくつかの固有の識別子だけを選択し、その後これらの識別子を使用して残りのプロパティ情報を後で取得する方が良いでしょう。例えば

、むしろ

let $properties:= for $property in collection('properties.dbxml')/properties/property[.....] 
    return $property 
let $properties := subsequence($properties,10,10) 
return <properties>{$properties}</properties> 

代わり

let $property_ids:= for $property in collection('properties.dbxml')/properties/property[.....] 
    return $property/unique_id 
return <properties>{ 
    for $id in subsequence($property_ids,10,10) return 
     collection('properties.dbxml')/properties/property[unique_id = $id] 
}</properties> 

を行うよりも、これは、メモリ内のシーケンスが小さいIDSはなく、大ノードの束であることを意味します。もちろん、これは最初にこれらのユニークなIDを持つ必要があることを意味しますが、MLSデータベースにはこのようなことがあると思われます。