該賞金到期in 4天。回答這個問題有資格獲得 50聲望獎勵。 Md. Tarikul Islam Soikot正在尋找一個規范的答案:
我認為更多的人應該知道它,因為我們現在仍在使用 OFFSET 進行分頁
我想在包含大量資料的表上應用分頁。我只想知道一個比在 SQL Server 中使用 OFFSET 更好的選擇。
這是我的簡單查詢:
SELECT *
FROM TableName
ORDER BY Id DESC
OFFSET 30000000 ROWS
FETCH NEXT 20 ROWS ONLY
uj5u.com熱心網友回復:
您可以為此使用鍵集分頁。它比使用行集分頁(按行號分頁)高效得多。
在這種型別的分頁中,您無法跳轉到特定的頁碼。你跳到一個特定的鍵并從那里閱讀。
除了明顯的效率提升之外,一個很大的好處是避免了分頁時的“丟失行”問題,這是由于從以前讀取的頁面中洗掉了行而引起的。按鍵分頁時不會發生這種情況,因為鍵不會改變。
讓我們假設您有一個TableName索引為 on的表Id,并且您希望從最新Id值開始并向后作業。
你開始:
SELECT TOP (@numRows)
*
FROM TableName
ORDER BY Id DESC;
注意使用
ORDER BY以確保順序正確
客戶端將保存最后收到的Id值(在這種情況下是最低的)。在下一個請求中,您跳轉到該鍵并繼續:
SELECT TOP (@numRows)
*
FROM TableName
WHERE Id < @lastId
ORDER BY Id DESC;
注意使用
<not<=
選擇的鍵必須是唯一的,因此如果您按非唯一列進行分頁,則必須向ORDER BY和都添加第二列WHERE。OtherColumn, Id例如,您需要一個索引來支持這種型別的查詢。不要忘記INCLUDE索引上的列。
SQL Server 不支持行比較器,因此您不能這樣做(OtherColumn, Id) < (@lastOther, @lastId)。
相反,您需要以下內容:
SELECT TOP (@numRows)
*
FROM TableName
WHERE (
OtherColumn = @lastOther AND Id < @lastId)
OR OtherColumn < @lastOther
)
ORDER BY
OtherColumn DESC,
Id DESC;
這比看起來更有效,因為 SQL Server 可以將其轉換為<兩個值的正確值。
NULLs的存在使事情進一步復雜化。您可能希望分別查詢這些行。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/399928.html
標籤:sql sql-server 分页 键集分页
上一篇:物體結構將類誤解為背景關系物體
