2

私の Db4o データベースには 7000 個のオブジェクトがあります。

すべてのオブジェクトを取得すると、ほぼ瞬時に取得できます.where 制約を追加すると、Name = "Chris" のように 6 ~ 8 秒かかります。

どうしたの?

また、検索タイプのクエリに Lucene を使用することについてのコメントをいくつか見ましたが、これに対する適切なリンクはありますか?

4

2 に答える 2

2

この質問は少し古いですが、おそらくこれは役に立ちます:

ネイティブクエリを使用する場合は、ラムダ式にブレークポイントを設定してみてください。ブレークポイントが実際に呼び出された場合、最適化が失敗したために問題が発生しています。ラムダを呼び出すには、各オブジェクトをインスタンス化する必要があり、これには非常にコストがかかります。

最適化が機能した場合、ラムダ式ツリーが分析され、実際のコードは必要ないため、ブレークポイントはトリガーされません。

また、接続を開く前に、フィールドの設定インデックスを実行する必要があることに注意してください。

最後に、単純なオブジェクトのテストケースがあります。クエリの最適化とインデックス作成を行わずに開始した場合(さらに悪いことに、モデル.dllを提供できなかったために強制的に使用されたサーバーを使用したGenericReflector場合)、約100,000個のオブジェクトに対する3つの基準のクエリには600秒もかかります。現在、250万個のオブジェクトに対する同じクエリに6秒かかるため、実際には大きなメリットがあります。

于 2010-02-24T01:00:11.120 に答える
2

確認することは 2 つあります。

  1. 「Db4objects.Db4o.NativeQueries」アセンブリを追加しましたか? このアセンブリがないと、ネイティブ クエリを最適化できません
  2. 名前を表すフィールドにインデックスを設定しましたか? インデックスはクエリをより高速にする必要があります インデックス:

    cfg.Common.ObjectClass(typeof(YourObject)).ObjectField("fieldName").Indexed(true);
    
于 2010-02-08T21:44:44.293 に答える