首页 > 数据库 > mysql教程 > 为什么 NHibernate QueryOver 与 Eager Fetching 会生成多个 SQL 查询?

为什么 NHibernate QueryOver 与 Eager Fetching 会生成多个 SQL 查询?

Susan Sarandon
发布: 2025-01-05 16:13:45
原创
502 人浏览过

Why Does NHibernate QueryOver with Eager Fetching Generate Multiple SQL Queries?

NHibernate QueryOver with Fetch 导致多个 SQL 查询

查询问题:

使用时QueryOver 使用预先加载来获取相关列表,会发生多次数据库命中,从而导致大量单独的SQL 查询。

示例:

Session.QueryOver<UserRole>()
       .Fetch(x => x.UsersInRole).Eager
       .List();
登录后复制

说明:

此行为是由于许多原因造成的 -对多关系。在示例映射中,UserRole 实体与 UsersInRole 实体具有多对多关系。当使用预加载时,NHibernate 会尝试为每个检索到的 UserRole 实体加载所有相关的 UsersInRole 实体。

但是,由于会话可能尚未包含所有相关实体,因此会发出多个 SQL 查询来检索这些关系。初始查询检索 UserRole 实体,并为每个 UserRole 发出后续查询以检索其相关的 UsersInRole 实体。

解决方案:

一种最小化 SQL 查询的有效解决方案就是使用批量抓取。通过在 HasManyToMany 映射上设置 BatchSize 属性,NHibernate 可以在单个 SQL 查询中获取多个相关实体。

HasManyToMany(x => x.UsersInRole)
...
.BatchSize(25)  
登录后复制

通过将批处理大小设置为适当的值(例如 25),NHibernate 将发出限制 SQL 查询数量,减少数据库总命中率并提高性能。

另外,在 Class 上设置批量大小地图还可以帮助优化整体抓取策略。

以上是为什么 NHibernate QueryOver 与 Eager Fetching 会生成多个 SQL 查询?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板