【问题标题】:NHibernate Eager Loading - Lots of unrelated dataNHibernate Eager Loading - 大量不相关的数据
【发布时间】:2010-07-19 17:20:38
【问题描述】:

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

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

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

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

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

保罗

【问题讨论】:

    标签: nhibernate optimization query-optimization eager-loading


    【解决方案1】:

    简短回答:视情况而定。

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

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

    您可以尝试很多事情:预缓存、使用连接而不是选择的急切获取等。除非智能应用,否则没有什么能保证更好的性能。

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

    【讨论】:

      【解决方案2】:

      由于您已将工作分流到小部件,因此正确的做法是让每个小部件对其所有必需的功能进行一次查询。即使您通过 AJAX 检索小部件也是如此(正如 cbp 所说,这不是一个坏主意)。

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

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

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

      【讨论】:

      • 感谢您的回答...将修改我的应用程序以通过 ajax 加载数据并使用 MultiCriteria 加载尽可能多的数据。
      猜你喜欢
      • 1970-01-01
      • 2011-03-14
      • 2018-11-16
      • 1970-01-01
      • 2013-06-01
      • 1970-01-01
      • 2016-05-29
      • 1970-01-01
      • 2011-05-09
      相关资源
      最近更新 更多