私はnhibernateプロファイラを使用して、 "Select n + 1"という警告を表示している場所をいくつか見ています。N + 1を選択してもeager joinより優れていますか?
明白な修正はいくつかの前向きな結合を行うことですが、特定のケースでは実際には決して実際には決して多くのデータをロードする可能性がある結合N + 1つかいます。
私はnhibernateプロファイラを使用して、 "Select n + 1"という警告を表示している場所をいくつか見ています。N + 1を選択してもeager joinより優れていますか?
明白な修正はいくつかの前向きな結合を行うことですが、特定のケースでは実際には決して実際には決して多くのデータをロードする可能性がある結合N + 1つかいます。
あなたの考えは正しいです。たとえば、すべてのルートエンティティは、別のエンティティの1つまたは2つのインスタンスを参照する場合があります。非正規化されたものではなく、2つまたは3つの小さな選択を行う方が速いかもしれません(つまり、結合を使用)
ほとんどの場合、これを便利にする方法があります:batch-size
。エンティティとコレクションの両方でこの属性を通常のページサイズに設定すると、一定数の小さな選択(エンティティタイプごとに1つ)が得られます。
あなたのアプリケーションに十分なデータがあれば、N + 1の選択はますます大きくなります。
一般にデータを読み込むのは、データベースにアクセスするのがはるかに安いです。あなたができるならば、あなたはそれを避けるべきです。
追加データを読み込むためのものです。あなたが使用されないプロパティ値をロードすると思っているなら、NHibernate 3.0遅延ロードプロパティを使うことができます。
したがって、N + 1の選択は避けてください。
私はあなたがあなたのマッピングで別のオプション
について知っているかどうかわからないですが、あなたが10個のアイテムを持っている場合は、あなただけの代わりに、2つのクエリが必要
<list name="MyItems" batch-size="10">
または
<bag name="MyItems" batch-size="10">
を追加します11. 20項目の場合、21の代わりに の3つが必要です。これにより、クエリの約90%が削除されます。
第3のオプションは、データの一部をロードする複数のクエリを実行することです – Paco