亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在SQLServer中分頁結果的最佳方法是什么

在SQLServer中分頁結果的最佳方法是什么

慕桂英546537 2019-06-18 13:32:58
在SQLServer中分頁結果的最佳方法是什么如果還想獲得結果總數(分頁前),那么在SQLServer 2000、2005、2008、2012中對結果進行分頁的最佳方法(性能方面)是什么?
查看完整描述

3 回答

?
哈士奇WWW

TA貢獻1799條經驗 獲得超6個贊

獲取結果總數和分頁是兩種不同的操作。為了這個例子,讓我們假設您正在處理的查詢是

SELECT * FROM Orders WHERE OrderDate >= '1980-01-01' ORDER BY OrderDate

在這種情況下,您將使用以下方法確定結果的總數:

SELECT COUNT(*) FROM Orders WHERE OrderDate >= '1980-01-01'

.這看起來很低效,但實際上性能相當好,假設所有索引等都已正確設置。

接下來,要以分頁的方式返回實際結果,以下查詢將是最有效的:

SELECT  *FROM    ( SELECT    ROW_NUMBER() OVER ( ORDER BY OrderDate ) AS RowNum, *
          FROM      Orders          WHERE     OrderDate >= '1980-01-01'
        ) AS RowConstrainedResultWHERE   RowNum >= 1
    AND RowNum < 20ORDER BY RowNum

這將返回原始查詢的第1-19行。這里最酷的是,特別是對于web應用程序來說,除了要返回的行號之外,您不需要保留任何狀態。


查看完整回答
反對 回復 2019-06-18
?
守候你守候我

TA貢獻1802條經驗 獲得超10個贊

令人難以置信的是,沒有其他答案提到最快在所有SQLServer版本中執行分頁的方法。對于大頁碼,偏移量可能非常慢,如下所示標桿..在SQL中執行分頁的方法完全不同,速度要快得多。這通常稱為“查找方法”或“keyset分頁”,如這篇博文.

SELECT TOP 10 first_name, last_name, score, COUNT(*) OVER()FROM playersWHERE (score < @previousScore)
   OR (score = @previousScore AND player_id < @previousPlayerId)ORDER BY score DESC, player_id DESC

“尋求謂詞”

這個@previousScore@previousPlayerId值是上一頁上一條記錄的相應值。這允許您獲取“下一步”頁面。如果ORDER BY方向是ASC,簡單地使用>相反。

使用上述方法,如果不首先獲取前40條記錄,就不能立即跳轉到第4頁。但通常情況下,你不想跳那么遠。相反,您可以獲得一個更快的查詢,根據索引的不同,該查詢可能能夠在固定時間內獲取數據。此外,無論底層數據是否發生變化(例如,在第1頁,而在第4頁上),您的頁面仍然是“穩定的”。

例如,這是在Web應用程序中延遲加載更多數據時實現分頁的最佳方法。

注意,“find方法”也稱為鍵集分頁.

分頁前記錄總數

這個COUNT(*) OVER()窗口函數將幫助您計算“分頁前”的總記錄數。如果使用的是SQLServer 2000,則必須對COUNT(*).


查看完整回答
反對 回復 2019-06-18
  • 3 回答
  • 0 關注
  • 790 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號