2014-10-29 19 views
0

我们发现,在我们的.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级别排序)的解决方案,还是有另一个我们需要采取的路径?

+0

@RadimKöhler我们几乎在所有情况下都会看到分页工作,除非没有。该问题是由大型数据库上的大型数据集引起的。这里的问题是:如何使它%100可靠? – Jonesome 2014-10-29 13:40:37

+0

如果您正在寻呼,您当然应该*订购您的结果。否则,SQL服务器的行为是未定义的 - 它可能以任何顺序返回行。 – 2014-10-29 16:42:58

+0

@RadimKöhlerOP修改 – Jonesome 2014-10-29 16:53:30

回答

0

答案是:ORDER BY是必需的。

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

相关问题