NHibernate QueryOver with Fetch Incurring Multiple Query Executions
親エンティティとその子コレクションを取得するために Fetch 句を使用して QueryOver を実行すると、多くの場合、過剰なデータベースヒットが発生します。この現象は、NHibernate が子コレクション内の行ごとに個別のクエリを発行するために発生します。
これを理解するには、UserRole エンティティと UsersInRole コレクションを使用したシナリオを考えてみましょう。最初のクエリは UserRole エンティティを取得します:
SELECT ... FROM UserRoles left outer join UsersInRoles on ...
取得された UserRole ごとに、NHibernate は別のクエリを実行して UsersInRole コレクションを取得します。その結果、次の形式の多数のクエリが生成されます。 >この動作を最適化するために、NHibernate では HasManyToMany で BatchSize プロパティを設定できるようになります。 mapping:
SELECT ... FROM UsersInRoles left outer join UserRoles on ... WHERE UserRoles.UserId=?
このオプションを指定すると、NHibernate は子コレクションをバッチでロードし、データベース クエリの数を最大 1 (バッチ サイズ / ページ サイズ) に減らします。これにより、過剰なデータベース ヒットを回避しながら、関連データを効率的に取得できるようになります。
以上がNHibernate QueryOver with Fetch により複数のデータベース クエリが発生するのはなぜですか? それを最適化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。