【问题标题】:NHibernate Paging performance (Better option)NHibernate 分页性能(更好的选择)
【发布时间】:2010-11-10 03:11:15
【问题描述】:

在那个简单的情况下:

public class Person
{
     public int Id {get;set;}
     public int Name {get;set;}
}
  • 我需要生成一个带有分页和排序的网格
  • 我的数据库有大约 10 万人

哪个选项性能更好:

1) 利用NHibernate一级缓存在第一时间和之后获取所有元素,例如:

personRep.FindAll().OrderBy(s =>s.Name).AsPagination(pageNumber,pageSize);

Obs.: AsPagination 是一种扩展方法...

2) 仅从数据库中获取实际页面,例如:

   public virtual IList<T> GetPaginedList(int __pageIndex, int __pageSize,out int __total)
    {            
        var _rowCount = Session.CreateCriteria(typeof(T))
            .SetProjection(Projections.RowCount()).FutureValue<Int32>();

        var _results = Session.CreateCriteria(typeof(T))
            .SetFirstResult(__pageIndex * __pageSize)
            .SetMaxResults(__pageSize)
            .Future<T>();

        __total = _rowCount.Value; 
        return _results;
    } 

【问题讨论】:

    标签: c# nhibernate paging


    【解决方案1】:

    第二个选项是最合适的。

    当您(用户)可能甚至没有“使用”所有这些实例时,一次性检索所有实例是没有用的。

    如果“Person”类是具有大量关联的“重”类,则最好创建一个“PersonView”类,它只包含您希望在 Grid 中显示的属性。

    您不必映射PersonView 类,您只需“导入”它,NHibernate 就会知道它的存在。 然后,您在 Person 类上创建一个查询,并定义必须使用 AliasToBean TransformerPerson 实例转换为 PersonView 实例。

    通过这样做,NHibernate 将能够生成一个查询,该查询仅从数据库中检索必要的列,并将用它填充 PersonView 实例。

    【讨论】:

    • 嗨 Frederik,你能告诉我如何“导入”视图并查询它吗?谢谢
    • 嗨,保罗,我在这里回答了一个类似的问题,并提供了一个代码示例:stackoverflow.com/questions/747382/…
    【解决方案2】:

    与许多数据检索性能问题一样,其中哪个更好将取决于使用场景。

    如果用户可能会在数据变得太陈旧而无法使用之前仔细阅读大部分或所有页面,则选项 1 会更好。在结果集相对较小(2-3 页)和结果集不会有太大变化的情况下(即从数据库中提取用户权限)也更好,允许您将整个数据集长时间存储在内存中-term,通过消除网络往返来提高未来运行的性能。

    选项 2 更适用于涉及长数据页和/或总结果集、“宽”记录或经常更改以致本地缓存效果不佳的数据的情况。它将检索记录的成本分散到结果集的使用中,达到显示它们所需的程度。分页结果的这种“延迟加载”确实增加了获取记录的总体时间和开销(因为有更多的往返行程),但您的用户更有可能注意到并抱怨他们的搜索结果有 10 秒的周转时间每页不到半秒。

    【讨论】:

      猜你喜欢
      • 2012-11-29
      • 2020-03-02
      • 2011-04-04
      • 1970-01-01
      • 2022-10-08
      • 2012-08-12
      • 1970-01-01
      • 1970-01-01
      • 2019-05-13
      相关资源
      最近更新 更多