ホームページ > データベース > mysql チュートリアル > NHibernate QueryOver の Eager Loading により複数のデータベース クエリが発生するのはなぜですか?

NHibernate QueryOver の Eager Loading により複数のデータベース クエリが発生するのはなぜですか?

Patricia Arquette
リリース: 2025-01-04 21:54:38
オリジナル
497 人が閲覧しました

Why Does NHibernate QueryOver's Eager Loading Cause Multiple Database Queries?

NHibernate QueryOver でのイーガー ロードにより複数のデータベース クエリが発生する

NHibernate QueryOver を使用して関連リストのイーガー フェッチを実行すると、次のような問題が発生する可能性があります複数のデータベースクエリで。これにより、データベース トラフィックが大幅に増加し、パフォーマンスが低下する可能性があります。

次のシナリオを考えてみましょう。

Session.QueryOver<UserRole>()
       .Fetch(x => x.UsersInRole).Eager
       .List();
ログイン後にコピー

このクエリは、UserRole のコレクションを選択し、関連する UsersInRole を積極的に取得しようとします。ただし、これにより、複数の個別のデータベース クエリが発生します。

  • すべての UserRole を取得する最初のクエリ。
  • 関連する UsersInRole を取得する各 UserRole の追加クエリ。

複数の原因クエリ

NHibernate はバッチ フェッチを使用して関連エンティティを効率的に取得します。ただし、関連エンティティの数がバッチ サイズを超える場合は、追加のクエリが必要になります。上記のシナリオでは、バッチ サイズが小さすぎて、1 つのクエリですべての UsersInRole を取得できない可能性があります。

解決策: バッチ サイズを調整します

この問題に対処するには、次のようにします。積極的なフェッチに使用されるバッチ サイズを調整できます。より大きなバッチ サイズを設定すると、NHibernate は 1 つのクエリでより多くの関連エンティティをフェッチしようとします。これにより、データベースのヒット数を大幅に減らすことができます。

マッピングを次のように変更します。

public class UserRoleMap : ClassMap<UserRole>
{
    public UserRoleMap()
    {
        ...
        HasManyToMany(x => x.UsersInRole)
        ...
        .BatchSize(25);
    }
}
ログイン後にコピー

バッチ サイズを 25 に設定すると、クエリごとに最大 25 の UsersInRole エンティティをフェッチするように NHibernate に指示されます。 。これにより、クエリが減り、パフォーマンスが向上する可能性があります。

追加の考慮事項

  • HQL で fetch="fetch" を使用すると、複数のデータベース クエリが発生する可能性もあります。これを回避するには、代わりに fetch="select" を使用します。
  • 熱心にフェッチすると、メモリ使用量が大幅に増加する可能性があります。必要な場合にのみ慎重に使用してください。

以上がNHibernate QueryOver の Eager Loading により複数のデータベース クエリが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート