2011-01-03 8 views
1

私はnhibernateプロファイラを使用して、 "Select n + 1"という警告を表示している場所をいくつか見ています。N + 1を選択してもeager joinより優れていますか?

明白な修正はいくつかの前向きな結合を行うことですが、特定のケースでは実際には決して実際には決して多くのデータをロードする可能性がある結合N + 1つかいます。

+0

第3のオプションは、データの一部をロードする複数のクエリを実行することです – Paco

答えて

2

あなたの考えは正しいです。たとえば、すべてのルートエンティティは、別のエンティティの1つまたは2つのインスタンスを参照する場合があります。非正規化されたものではなく、2つまたは3つの小さな選択を行う方が速いかもしれません(つまり、結合を使用)

ほとんどの場合、これを便利にする方法があります:batch-size。エンティティとコレクションの両方でこの属性を通常のページサイズに設定すると、一定数の小さな選択(エンティティタイプごとに1つ)が得られます。

1

あなたのアプリケーションに十分なデータがあれば、N + 1の選択はますます大きくなります。

一般にデータを読み込むのは、データベースにアクセスするのがはるかに安いです。あなたができるならば、あなたはそれを避けるべきです。

追加データを読み込むためのものです。あなたが使用されないプロパティ値をロードすると思っているなら、NHibernate 3.0遅延ロードプロパティを使うことができます。

したがって、N + 1の選択は避けてください。

1

私はあなたがあなたのマッピングで別のオプション

について知っているかどうかわからないですが、あなたが10個のアイテムを持っている場合は、あなただけの代わりに、2つのクエリが必要

<list name="MyItems" batch-size="10"> 

または

<bag name="MyItems" batch-size="10"> 

を追加します11. 20項目の場合、21の代わりに の3つが必要です。これにより、クエリの約90%が削除されます。

関連する問題