C#:永続モデルを使用した非常に高速なオブジェクト検索と取得

c# database performance search
C#:永続モデルを使用した非常に高速なオブジェクト検索と取得

Fluent nHibernat / nHibernate 3 / Sqliteを使用してアプリケーションを開発しています。 私は助けが必要な非常に特定の問題に遭遇しました。

製品データベースとバッチデータベースがあります。 製品は約1万個ですが、バッチは現在、約1,100万以上のマークで実行されています。 製品が提供されたら、コンボボックスにバッチを入れる必要があります。 メモリの制約のためにすべてのバッチを一度にロードしたくないので、製品が提供されたときにデータベースから直接バッチをロードしています。 しかし、問題は、このためのsqlite(またはsqliteとnhの組み合わせ)が少し遅いことです。 通常、特定の製品のバッチを取得するには約3秒以上かかります。 遅いシナリオとは思えないかもしれませんが、今回は改善できることを知りたいですか? 注文入力をスムーズに行うには、1秒未満の結果が必要です。

詳細は

  • 新しい製品とバッチは定期的に(隔月)インポートされます。

  • すでに永続化された製品またはバッチの何も変更されません(いいえ
    「更新」)。

  • 製品の保管は問題ではありません。 バッチが主な原因です。

  • 製品IDは「長い」

  • バッチIDは「文字列」です

  • バッチには、レート、mrp(両方とも「10進数」)、有効期限の3つのフィールドが含まれます
    DateTime)。

要求事項:

  • データはファイルベースのソリューションに保存する必要があります。 使用できません
    クライアントサーバーアプローチ。

  • *保管時間は重要ではありません。 検索および取得時間は*です。

  • 私は他の永続性を使用してバッチデータベースを保存することにオープンです
    モデル。

  • Luceneのようなもの、またはnosqlデータベース(
    redis)、またはoodb(単一ストレージファイルの実装に基づいている場合)。

高速オブジェクト検索に使用できるものを提案してください。

ありがとう。

  3  0


ベストアンサー

これらの3秒以上の位置を調べるには、プロファイルを作成するか、絞り込む必要があります。

データベースのフェッチですか? + Sqlite browserで同じクエリを実行してみてください。 クエリにも3秒以上かかりますか? 次に、適切なインデックスを追加するなど、データベースで何かをする必要があるかもしれません。

コンボボックスがいっぱいですか? コンボボックスの最初の値のみを入力し、他の値を捨てる場合はどうなりますか? それはパフォーマンスを高速化しますか? 次に、http://msdn.microsoft.com/en-us/library/system.windows.forms.combobox.beginupdate.aspx [BeginUpdate]およびEndUpdateを試してください。

3秒以上はどこですか? その場合、どこで見つけるか。

1


これはばかげた質問のように思えるかもしれませんが、代替案や他の最適化に進む前にダブルチェックする必要があると考えましたが、BatchテーブルのBatch Id列にインデックス(または、できれば主キー)があります。 インデックスがなければ、この種の検索は非常に遅くなります。

オブジェクトを高速で取得するには、キー/値ストアが実行可能な代替手段であることは間違いありません。 Batchesデータベースは少し大きすぎてメモリに収まらない可能性があるため、この状況で必ずしもredisをお勧めするかどうかはわかりません。また、ディスクに格納することもできますが、メモリに厳密に収まるデータセットに適している場合は一般に優れています。

私の個人的なお気に入りはhttp://www.mongodb.org/[mo​​ngodb]です。しかし、全体的に最善のことは、バッチデータを取得し、それをいくつかの異なるnosql dbにロードし、どのような読み取りパフォーマンスを確認することです。データに最も適したものを取得して選択します。 Mongoは非常に高速で簡単に操作できます。このような単純なデータ構造のために、おそらくnhibernateレイヤーを捨てることができます。

ローカルで実行する必要があるデーモンがありますが、dbのサイズに応じて単一ファイル(または、より多くのスペースを割り当てる必要がある場合はいくつかのファイル)になります。 繰り返しますが、バッチID列にインデックスがあることを確認して、すばやく検索できるようにします。

0


データベースから最大100レコードをロードするのに3秒ですか? それは遅いです。 生成されたSQLを調べて、クエリのパフォーマンスを向上させるインデックスを作成する必要があります。

特に、バッチテーブルのProductId列にはインデックスを付ける必要があります。

0


タイトルとURLをコピーしました