私の Db4o データベースには 7000 個のオブジェクトがあります。
すべてのオブジェクトを取得すると、ほぼ瞬時に取得できます.where 制約を追加すると、Name = "Chris" のように 6 ~ 8 秒かかります。
どうしたの?
また、検索タイプのクエリに Lucene を使用することについてのコメントをいくつか見ましたが、これに対する適切なリンクはありますか?
私の Db4o データベースには 7000 個のオブジェクトがあります。
すべてのオブジェクトを取得すると、ほぼ瞬時に取得できます.where 制約を追加すると、Name = "Chris" のように 6 ~ 8 秒かかります。
どうしたの?
また、検索タイプのクエリに Lucene を使用することについてのコメントをいくつか見ましたが、これに対する適切なリンクはありますか?
この質問は少し古いですが、おそらくこれは役に立ちます:
ネイティブクエリを使用する場合は、ラムダ式にブレークポイントを設定してみてください。ブレークポイントが実際に呼び出された場合、最適化が失敗したために問題が発生しています。ラムダを呼び出すには、各オブジェクトをインスタンス化する必要があり、これには非常にコストがかかります。
最適化が機能した場合、ラムダ式ツリーが分析され、実際のコードは必要ないため、ブレークポイントはトリガーされません。
また、接続を開く前に、フィールドの設定インデックスを実行する必要があることに注意してください。
最後に、単純なオブジェクトのテストケースがあります。クエリの最適化とインデックス作成を行わずに開始した場合(さらに悪いことに、モデル.dllを提供できなかったために強制的に使用されたサーバーを使用したGenericReflector
場合)、約100,000個のオブジェクトに対する3つの基準のクエリには600秒もかかります。現在、250万個のオブジェクトに対する同じクエリに6秒かかるため、実際には大きなメリットがあります。
確認することは 2 つあります。
名前を表すフィールドにインデックスを設定しましたか? インデックスはクエリをより高速にする必要があります インデックス:
cfg.Common.ObjectClass(typeof(YourObject)).ObjectField("fieldName").Indexed(true);