懒惰加载真的很糟糕吗?

时间:2010-01-28 14:57:44

标签: sql linq nhibernate entity-framework lazy-loading

我听说很多关于延迟加载的性能问题,无论是在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,我意识到浪费了很多数据。想象一下,所有帖子都是同一个用户。内部联接将为每个帖子行带来所有用户列。

在表现中,哪种方法最好?

5 个答案:

答案 0 :(得分:13)

延迟加载既不好也不坏。请参阅此文章以获得更长的解释:

When should one avoid using NHibernate's lazy-loading feature?

通常,延迟加载是ORM的一个很好的默认行为,但作为ORM用户,您需要意识到何时要急切地覆盖默认和加载数据。分析应用程序的性能是决定使用延迟加载或不使用延迟加载的最佳方法。警惕在过早优化上花费太多精力。

答案 1 :(得分:5)

Lazy Loading的问题是了解它是什么以及什么时候它可以咬你。您需要了解可以对数据库进行多少潜在的旅行,以及如何解决这个问题。我不认为LL是坏的。我只需要了解它的后果。

答案 2 :(得分:4)

我的大多数应用程序都涉及服务边界(Web服务,WCF等),此时OR / M上的延迟加载毫无意义,并且在您的服务顶部实现延迟加载是一种一个坏主意(实体现在必须知道服务)。

答案 3 :(得分:1)

对于延迟加载没有坏处和好处。 您必须决定是否更喜欢在运行时或应用程序加载时加载资源。 例如 - 实时通常使用缓冲区来避免在运行时分配资源。这与延迟加载相反,对实时软件有益。

如果您的应用程序运行时间很长,并且您不想在启动时分配资源,则延迟加载是有益的。

答案 4 :(得分:1)

旧线程,但搜索将其打开,所以我加了两美分。除了必须意识到潜在的性能问题之外,在处理数据上下文之后访问字段的问题阻止了我现在使用LL。如果从创建和处理数据上下文的方法返回实体实例(这是设计使用它们的方式),则访问这些虚拟字段将导致异常故障。对此的解决方案是在查询中包含字段(即.Include),从不从数据层/服务返回实体类,或者使数据上下文保持活动更长时间。包括字段是最好的选择,如果没有启用延迟加载,这也很容易。