Sql-Server

SQL Server 中的分頁:是否需要 order by 子句?(目前,缺少行)

  • October 29, 2014

我們有一些通過 SQL 結果分頁的程式碼。(目前在 SQL Server 2008 上執行)

我們注意到,當分頁完成時,一些行沒有返回。讓我澄清一下:

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

使用TOP(n)withoutORDER BY將以 Sql Server 關心的任何方式返回n行。根據文件

如果查詢沒有 ORDER BY 子句,則行的順序是任意的。

此外,沒有WITH TIES. 也考慮使用它,以免您也錯過一些行:

WITH TIES 指定從基本結果集中返回的附加行在作為 TOP n (PERCENT) 行的最後一行出現的 ORDER BY 列中具有相同的值。TOP…WITH TIES 只能在 SELECT 語句中指定,並且只有在指定了 ORDER BY 子句時才能指定。

綁定記錄的返回順序是任意的。ORDER BY 不影響此規則。

考慮更新到 Sql Server 2012/2014。您可以享受新功能,例如使用OFFSET FETCH.

引用自:https://dba.stackexchange.com/questions/81382