我们发现,在我们的.NET 4.51/nHibernate/SQL 2008应用程序中,当我们执行单个大型查询时,我们获取所有数据,但是当我们针对特定大型结果集进行页面调整时,行被忽略。在nHibernate中针对SQL Server进行分页:是否需要排序?
(在我们的测试中,当我们做的200个网页的网页,对结果集是1000点以上的行,我们看到了这个问题。)
我们使用SQL2000和SQL2005 NHibernate的方言试过的应用,并没有看到行为上的差异。 (查询语法确实演变为在SQL2005中使用更新的结构,但使用SQL2005方言时缺少相同的数据。)
nHibernate生成SQL查询。 我们正在做分页。 如果我们页面100,顺便NHibernate的生成连续的SQL查询是:
- TOP 100 //给了我们第一个100
- TOP 200 //给了我们这个区块的
- 等 2日100
上面没有ORDER BY /在nHibernate级别排序,最终结果是某些行永远不会映射到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亿行)上,甚至只有当查询返回大于1000行且被分页时才出现。
是一个Order By子句(在nHibernate级别排序)的解决方案,还是有另一个我们需要采取的路径?
@RadimKöhler我们几乎在所有情况下都会看到分页工作,除非没有。该问题是由大型数据库上的大型数据集引起的。这里的问题是:如何使它%100可靠? – Jonesome 2014-10-29 13:40:37
如果您正在寻呼,您当然应该*订购您的结果。否则,SQL服务器的行为是未定义的 - 它可能以任何顺序返回行。 – 2014-10-29 16:42:58
@RadimKöhlerOP修改 – Jonesome 2014-10-29 16:53:30