在针对SQL Server的nHibernate中进行分页:是否需要排序顺序?

时间:2014-10-29 13:35:45

标签: sql-server nhibernate

我们在.NET 4.51 / nHibernate / SQL 2008应用程序中发现,当我们执行单个大型查询时,我们会获取所有数据,但是当我们针对某些大型结果集进行分页时,会丢失行。

(在我们的测试中,当我们每页打印200页时,对于1000行或更多行的结果集,我们会看到问题。)

我们使用SQL2000和SQL2005 nHibernate方言尝试了应用程序,并且没有看到行为上的差异。 (查询语法确实演变为在SQL2005中使用较新的结构,但使用SQL2005方言时缺少相同的数据。)

nHibernate生成SQL查询。 我们正在做分页。 如果我们以100分页,那么nHibernate生成连续SQL查询的方式是:

  • TOP 100 //给我们第一个100
  • TOP 200 //给我们这块的第二个100

上面没有在nHibernate级别进行ORDER BY /排序,最终结果是某些行永远不会出现在nHibernate中。我们推测这是由于SQL的任意排序,因此行在页面内“移动”(因此“隐藏”在我们的应用程序代码中)。

如果我们将nHibnerate查询作为单个镜头(返回所有行)进行,我们会看到所有数据。 (下面的查询是由nhibernate生成的。)

添加order by子句(又名nHibernate排序)会有帮助吗?

SELECT top 33 
 ... <field list> 
FROM 
  salesOrder this_ left outer join [Item] Item2_ on this_.ItemId=Item2_.ItemId 
WHERE this_.AccountId = @p0 
and this_.ModifiedAt > @p1 
and this_.ModifiedAt <= @p2

数据库非常大,但没有碎片化,性能也很好。这个问题只出现在非常大的表(1亿行)上,甚至只有当查询返回&gt; 1000行AND被分页。

是一个Order By子句(nHibernate级别的排序)解决方案,还是我们需要采取另一条路径?

1 个答案:

答案 0 :(得分:0)

答案是:ORDER BY是必需的。

IOW,在nHibernate查询中使用排序顺序(在索引字段上获得最佳结果!)。