2013-11-22 38 views
2

我有查詢按頁碼如下獲取記錄,爲什麼我的查詢速度慢以獲取大偏移量的記錄?

SELECT 
    FirstName = R.FirstName, 
    LastName = R.LastName, 
    CountryId = R.CountryID, 
    ...... 
FROM Resource AS R 
WHERE ... 
ORDER BY LastName, FirstName 
OFFSET 10 * (@PageNumber - 1) ROWS 
FETCH NEXT 10 ROWS ONLY 

的記錄總數超過30,000。

  • @PageNumber = 1,運行時間小於1秒,幾乎立即。
  • @PageNumber = 500,運行時間約爲4s。
  • @PageNumber = 1000,運行時間小於12s。
  • @PageNumber = 2000,運行時間少於20s。
  • @PageNumber = 3000時,運行時間小於28s。

我想知道爲什麼獲取記錄的偏移量比較小的記錄要慢得多,因爲獲取的行的總數是相同的(10)。它看起來像查詢前面的記錄比坐在後面的記錄快得多。或者在查詢中有什麼問題?

+1

你看執行計劃嗎?它說什麼? – peterm

回答

5

由於文檔指出Offset Fetch(粗體重點煤礦):

OFFSET { integer_constant | offset_row_count_expression } { ROW | ROWS } 

指定開始從查詢表達式返回行 前跳過,的行數。 OFFSET子句的參數可以是整數 或大於或等於零的表達式。您可以交替使用ROW 和ROWS。

這意味着所有的行都會被提取,但會跳過您作爲參數傳遞的行數。所以更多的線條,更多的時間。就那麼簡單。

+1

同意。我認爲提問者是混淆SQL Server必須完成的工作,以及通過線路發送的內容。如果不計算前N個結果,它如何跳過N個結果? 'OFFSET'似乎與'ORDER BY'的精神相同 - 這是一種使用lite報表格式而不是像SSRS那樣的「真實」工具的方式。如果你需要一些快速跳躍到某些標準的第N個元素的概念,你需要找出一種方法在索引中表達。 –

相關問題