NHibernate Eager Loading - 大量不相关的数据

时间:2010-07-18 23:55:13

标签: nhibernate optimization query-optimization eager-loading

我的会员将能够使用X个小部件自定义他们的个人资料页面,每个小部件显示不同的数据,例如音乐列表,他们关注的人员列表等。

几个小部件包括:   - 他们上传的媒体列表   - 他们关注的人员名单   - 关注他们的人员名单   - Html /文本小部件   - 媒体统计(num下载等)   - 评论小部件,供其他成员发表评论

有些小部件必须对返回的数据进行分页,因为可能有数百个结果。

我目前还没有进行任何优化,所以它正在做大量的数据库工作来返回所有数据......什么是最有效的方法来检索数据......每个小部件需要1个DB调用是否可以接受?每页可能有大约5-20个小部件。

如果您需要有关我的情况的更多信息,请随时提出。

2 个答案:

答案 0 :(得分:2)

简短回答:这取决于。

从未经优化的状态开始,然后使用SQL分析器或像dotTrace这样的C#分析器来计算出改进的最佳位置。设定一个现实的目标(例如'加载页面的时间少于800毫秒')。

通常我发现在请求中大约20-30个数据库调用后性能开始下降,但这取决于您的服务器,数据库的位置等。

你可以尝试很多东西:预缓存,使用连接而不是选择等的急切获取。除非智能地应用,否则什么都不能保证更好的性能。

对于包含大量小部件的页面,常见的设计模式是使用AJAX异步加载每个小部件,而不是一次性加载整个页面。

答案 1 :(得分:0)

因为你已经将你的工作分解为小部件,所以要做的就是让每个小部件对所有必需的功能进行单一查询。即使你通过AJAX检索小部件也是如此(正如cbp所说,这不是一个坏主意)。

其次,我会为每个小部件设置某种机制来注册它的存在,然后在所有小部件都已注册之后,我将触发一个包含所有小部件查询的查询。 (从技术上讲,它又是多次查询,但在一次往返中,请参阅NH参考文献中的MulriCriteria和MultiQueries)。

另外,不要忘记延迟加载是隐藏的数据库检索,并且在负载正常的情况下使用延迟加载可能会对性能产生巨大的影响(例如Foo.Bar.Name,您始终显示Bar。呈现Foo实体时的名称值

即使每个请求的数据库调用少于20-30次,也可能会出现性能下降,但这取决于实体的大小和复杂性,查询,过滤器以及检索到的数据集的大小。