NHibernate急切加载-大量不相关的数据

NHibernate急切加载-大量不相关的数据,nhibernate,optimization,query-optimization,eager-loading,Nhibernate,Optimization,Query Optimization,Eager Loading,我的会员将有能力定制他们的个人资料页面与X数量的小部件,每个小部件显示不同的数据,如音乐列表,名单的人,他们正在跟踪等 几个小部件包括: -他们上传的媒体列表 -他们正在跟踪的人的名单 -跟随他们的人的名单 -Html/文本小部件 -媒体统计(下载次数等) -用于其他成员留下评论的评论小部件 一些小部件将不得不分页返回的数据,因为可能会有数百个结果 我目前还没有做任何优化,所以它正在做大量的DB工作来返回所有数据…检索数据的最有效方法是什么…每个小部件1个DB调用是否可以接受?每页可能有5-20

我的会员将有能力定制他们的个人资料页面与X数量的小部件,每个小部件显示不同的数据,如音乐列表,名单的人,他们正在跟踪等

几个小部件包括: -他们上传的媒体列表 -他们正在跟踪的人的名单 -跟随他们的人的名单 -Html/文本小部件 -媒体统计(下载次数等) -用于其他成员留下评论的评论小部件

一些小部件将不得不分页返回的数据,因为可能会有数百个结果

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

如果你需要更多关于我的情况的信息,请随时询问


保罗

简短回答:视情况而定

从未优化状态开始,然后使用SQL探查器或dotTrace之类的C#探查器找出最佳改进位置。设定一个切实可行的目标(例如“加载页面的时间小于800毫秒”)

一般来说,我发现在一个请求中调用20-30个数据库后,性能开始下降,但这取决于服务器、数据库的位置等

您可以尝试很多事情:预缓存、使用连接而不是选择的快速获取等。但是,除非智能地应用它,否则无法保证更好的性能


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

既然您已经将工作裁剪到小部件上,正确的做法是每个小部件对其所需的所有功能执行单个查询。即使您通过AJAX检索小部件(正如cbp所指出的,这不是一个坏主意),情况也是如此

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

另外,不要忘记,延迟加载是隐藏的数据库检索,如果在适当的情况下使用延迟加载(例如Foo.Bar.Name,在显示Foo实体时始终显示Bar.Name值),则可能会对性能产生巨大影响


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

感谢您的回答…将修改我的应用程序,通过ajax加载数据,并使用多准则加载尽可能多的数据。