我们在.NET 4.51 / nHibernate / SQL 2008应用程序中发现,当我们执行单个大型查询时,我们会获取所有数据,但是当我们针对某些大型结果集进行分页时,会丢失行。
(在我们的测试中,当我们每页打印200页时,对于1000行或更多行的结果集,我们会看到问题。)
我们使用SQL2000和SQL2005 nHibernate方言尝试了应用程序,并且没有看到行为上的差异。 (查询语法确实演变为在SQL2005中使用较新的结构,但使用SQL2005方言时缺少相同的数据。)
nHibernate生成SQL查询。 我们正在做分页。 如果我们以100分页,那么nHibernate生成连续SQL查询的方式是:
上面没有在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级别的排序)解决方案,还是我们需要采取另一条路径?
答案 0 :(得分:0)
答案是:ORDER BY
是必需的。
IOW,在nHibernate查询中使用排序顺序(在索引字段上获得最佳结果!)。