带有 Fetch 的 NHibernate QueryOver 会引发多个查询执行
使用 Fetch 子句执行 QueryOver 来检索父实体及其子集合通常会导致数据库点击量过多。出现此行为的原因是 NHibernate 对子集合中的每一行发出单独的查询。
要理解这一点,请考虑具有 UserRole 实体和 UsersInRole 集合的场景。第一个查询检索 UserRole 实体:
SELECT ... FROM UserRoles left outer join UsersInRoles on ...
对于检索到的每个 UserRole,NHibernate 然后执行一个单独的查询来获取 UsersInRole 集合,从而产生以下格式的大量查询:
SELECT ... FROM UsersInRoles left outer join UserRoles on ... WHERE UserRoles.UserId=?
为了优化此行为,NHibernate 允许在 HasManyToMany 上设置 BatchSize 属性映射:
HasManyToMany(x => x.UsersInRole) ... .BatchSize(25)
通过指定此选项,NHibernate 将批量加载子集合,将数据库查询次数减少到最多 1(batch-size / page-size)。这确保了相关数据的高效检索,同时避免过多的数据库命中。
以上是为什么NHibernate QueryOver with Fetch会导致多次数据库查询,如何优化?的详细内容。更多信息请关注PHP中文网其他相关文章!