NHibernate QueryOver でのイーガー ロードにより複数のデータベース クエリが発生する
NHibernate QueryOver を使用して関連リストのイーガー フェッチを実行すると、次のような問題が発生する可能性があります複数のデータベースクエリで。これにより、データベース トラフィックが大幅に増加し、パフォーマンスが低下する可能性があります。
次のシナリオを考えてみましょう。
Session.QueryOver<UserRole>() .Fetch(x => x.UsersInRole).Eager .List();
このクエリは、UserRole のコレクションを選択し、関連する UsersInRole を積極的に取得しようとします。ただし、これにより、複数の個別のデータベース クエリが発生します。
複数の原因クエリ
NHibernate はバッチ フェッチを使用して関連エンティティを効率的に取得します。ただし、関連エンティティの数がバッチ サイズを超える場合は、追加のクエリが必要になります。上記のシナリオでは、バッチ サイズが小さすぎて、1 つのクエリですべての UsersInRole を取得できない可能性があります。
解決策: バッチ サイズを調整します
この問題に対処するには、次のようにします。積極的なフェッチに使用されるバッチ サイズを調整できます。より大きなバッチ サイズを設定すると、NHibernate は 1 つのクエリでより多くの関連エンティティをフェッチしようとします。これにより、データベースのヒット数を大幅に減らすことができます。
マッピングを次のように変更します。
public class UserRoleMap : ClassMap<UserRole> { public UserRoleMap() { ... HasManyToMany(x => x.UsersInRole) ... .BatchSize(25); } }
バッチ サイズを 25 に設定すると、クエリごとに最大 25 の UsersInRole エンティティをフェッチするように NHibernate に指示されます。 。これにより、クエリが減り、パフォーマンスが向上する可能性があります。
追加の考慮事項
以上がNHibernate QueryOver の Eager Loading により複数のデータベース クエリが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。