2011-07-11 26 views
3

集合体が多数のエンティティ(1000+)を持つバッグを持つパフォーマンス上の問題を抱えています。通常、エンティティは最大50エンティティのみが含まれますが、場合によってはさらに多くのエンティティが含まれます。大きなバッグを読むときにNHibernateが遅くなる

NHibernateプロファイラを使用すると、データベースからこのバッグの1123レコードをフェッチする時間は18msですが、処理するにはNHibernate 1079msがかかります。ここで問題となるのは、1123のレコードすべてに1つまたは2つの追加レコードがあることです。 fetch = "subselect"を使用してこれらを取得し、これらの追加レコードをフェッチするにはデータベースからフェッチするのに16msかかり、NHibernateで2527ms処理します。だから、この行動だけで3.5秒かかりますが、それはあまりにも高価です。

これは、第1レベルのキャッシュを更新することが、多くのエンティティを読み込むときにパフォーマンスが低下するため、ここでの問題であるということが読み取れます。しかし、何がたくさんあるのですか? NHibernate Profilerによると、私は1145個のエンティティが31個のクエリでロードされています(私の場合は絶対最小です)。ロードされたエンティティの数は、私にはあまりないようです。我々はNHibernateはv3.1.0.4000

+0

こちらをご覧ください:http://knol.google.com/k/nhibernate-chapter-16-improving-performance# – danyolgiax

答えて

2

私は同意し、1000個のエンティティを使用している現在のプロジェクトで

は、あまりにも多くはありません。コンストラクタやプロパティセッターのいずれかで時間が使用されていないことを確かめていますか?ロード時間中にデバッガを停止して、時間を費やしてランダムサンプルを取得することができます。

また、リフレクションオプティマイザを使用していることを確認してください(デフォルトでオンになっていると思います)。

クエリ自体の時間を測定すると仮定します。トランザクション全体を測定する場合、セッションをフラッシュするのに時間がかかることが最も確実です。 FlushModeNeverに設定してフラッシュするのを避けてください(保存するセッションに変更がない場合のみ)。StatelessSessionを使用してください。

野生の推測:バッチサイズの設定を削除すると、エンティティを対応するコレクションに割り当てる必要がないため、バッチサイズの設定を削除すると、処理が高速になることさえあります。

関連する問題