2

次のクエリが返されるまでに時間がかかります。

db.Query<Person>(x => x.StartsWith("Chr", StringComparison.CurrentCultureIgnoreCase))

これを正しく機能させる方法はありますか?つまり、より速く?

4

2 に答える 2

2

たぶん、 db4oのクエリ最適化の制限に遭遇したかもしれません。通常、ネイティブクエリとLINQクエリは低レベルのSODAクエリに変換されます。この最適化が失敗すると、db4oはクエリを実行するためにデータベース内のオブジェクトをインスタンス化します。ご想像のとおり、これは非常に遅い場合があります。

現在の最善の解決策は、この場合に直接SODAを使用することです。たとえば、1つのプロパティを持つクラス:

 public class SimpleObject
 {
     private string name;
     public string Name
     {
         get { return name; }
        set { name = value; }
     }
 }

次のようなネイティブクエリ:

var result = db.Query<SimpleObject>(x => x.Name.StartsWith ("Chr",StringComparison.CurrentCultureIgnoreCase));

このSODA-Queryで表すことができます:

IQuery query = db.Query();
query.Constrain(typeof (SimpleObject)); // restrict to a certain class
query.Descend("name").Constrain("Chr").StartsWith(false); // the field 'name' starts with  'chr', case-insensitive

foreach (var s in query.Execute())
{
    // 
}

Query-Optimizerの将来のバージョンがこのケースを直接サポートすることを願っています。

于 2010-02-08T21:32:29.150 に答える
0

比較している列にインデックスを追加すると、おそらく役立つでしょう。

http://developer.db4o.com/Documentation/Reference/db4o-7.4/net35/tutorial/docs/Indexes.html#outline219

于 2010-02-07T13:54:39.973 に答える