2014-10-29 47 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查詢中使用排序順序(在索引字段中獲得最佳結果!)。

相關問題