ホームページ > データベース > mysql チュートリアル > 関連コレクションをフェッチするときに複数のデータベース ヒットを回避するために NHibernate QueryOver を最適化するにはどうすればよいですか?

関連コレクションをフェッチするときに複数のデータベース ヒットを回避するために NHibernate QueryOver を最適化するにはどうすればよいですか?

Mary-Kate Olsen
リリース: 2025-01-04 13:19:40
オリジナル
269 人が閲覧しました

How Can I Optimize NHibernate QueryOver to Avoid Multiple Database Hits When Fetching Related Collections?

NHibernate QueryOver での複数の SQL クエリを Fetch で克服する

問題:

NHibernate の QueryOver 構文を使用してエンティティを取得する関連するコレクションを使用すると、多数のデータベース ヒットが発生します。この動作は、主に多対多のリレーションシップで発生します。

原因:

NHibernate の積極的フェッチ メカニズムは、リレーションの外部キー列で見つかった個別の値ごとに個別のクエリをトリガーします。 。この問題は、コレクションが積極的フェッチ用にマークされているが、ISession に必要なオブジェクトがすべて含まれていない場合に発生します。

マッピング例:

public class UserRoleMap : ClassMap<UserRole>
{
    public UserRoleMap()
    {
        Id(x => x.Id);
        Map(x => x.RoleName);
        HasManyToMany(x => x.UsersInRole)
            .Inverse()
            .LazyLoad()
            .Table("UsersInRoles");
    }
}
ログイン後にコピー

シナリオ:

次のものがあると仮定します。 data:

  • User1 has Role1
  • User2 has両方のRole1とRole2

Fetch(x => x.UsersInRole) でUserRoleを取得するときは熱心です、最初のクエリはUser1とRole1を取得します。ただし、セッションには、Role1 に関連付けられたすべてのユーザーが含まれていないため、NHibernate は欠落しているユーザーを取得するために複数の追加クエリを実行し、パフォーマンスの低下を引き起こします。

解決策:

推奨される解決策は、バッチ サイズを設定して NHibernate のバッチ フェッチ メカニズムを使用することです。 collection:

HasManyToMany(x => x.UsersInRole)
    ...
    .BatchSize(25)
ログイン後にコピー

バッチ サイズを 25 以上に設定すると、NHibernate は遅延ロードされたコレクションに対して一度に最大 25 レコードを取得します。この最適化により、最初のクエリ内でのコレクションの取得または最小限の追加クエリが結合され、データベース ヒットが大幅に削減されます。

以上が関連コレクションをフェッチするときに複数のデータベース ヒットを回避するために NHibernate QueryOver を最適化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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