【发布时间】:2010-01-28 14:57:43
【问题描述】:
我听说过很多关于延迟加载的性能问题,无论是在 NHibernate、Linq....
问题是 N+1 选择。例如,我想要所有帖子及其用户,在 foreach 我懒加载用户,我需要一个选择帖子,加上每个用户选择 N 个。
延迟加载:
1 - select ....from post
N - select ....from user
“好的”方法是加入:
1 - select .....from post inner join user on post.UserId = user.Id
但是看到EF生成的SQL,我意识到浪费了很多数据。假设所有帖子都是同一个用户。 Inner Join 将为每个帖子行带来所有用户列。
在性能方面,哪种方法最好?
【问题讨论】:
-
这是一个很好的问题——如何选择——但我认为答案很大程度上取决于数据。但是,我认为您会感到惊讶的是,多个查询通常比“数据浪费”更糟糕,因为返回的数据超出了您的需要。换句话说,在某些情况下延迟加载很好,但在“典型”应用程序中却很少。
-
您的答案还取决于您的 ORM,因为在 EF 中,要使用您的示例,这不是唯一的两个选项。
-
@Craig Stuntz 还有哪些选择?我正在使用 EF4
-
在 EF(任何版本)中,您可以显式加载、急切加载或项目。在 EF 4 中,您也可以延迟加载。恕我直言,投影通常是正确的选择,因为它允许使用任何其他选项都无法实现的事情。
-
@Craig Stuntz,急切加载是“Include()”方法,项目是“select { post, post.user}”,加载是这样的吗? "context.LoadProperty(beveragesCategory, c => c.Products);"
标签: sql linq nhibernate entity-framework lazy-loading