为什么我的查询很慢以获取具有大偏移量的记录?

use*_*440 3 sql t-sql sql-server

我有查询按页码获取记录,如下所示,

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
Run Code Online (Sandbox Code Playgroud)

记录总数超过30,000.

  • @PageNumber = 1,运行时间小于1s时,几乎是瞬间.
  • 何时@PageNumber = 500,运行时间约为4s.
  • 何时@PageNumber = 1000,运行时间小于12秒.
  • 何时@PageNumber = 2000,运行时间小于20s.
  • 何时@PageNumber = 3000,运行时间小于28s.

我想知道为什么获取具有较大偏移量的记录比较小的记录慢得多,因为获取的行的总数是相同的(10).看起来查询前端记录比后面的记录快得多.或者查询中有什么问题?

Jor*_*pos 5

正如文档所述,Offset Fetch(大胆强调我的):

OFFSET { integer_constant | offset_row_count_expression } { ROW | ROWS }
Run Code Online (Sandbox Code Playgroud)

在开始从查询表达式返回行之前,指定要跳过的行数.OFFSET子句的参数可以是大于或等于零的整数或表达式.您可以互换使用ROW和ROWS.

这意味着将获取所有行,但跳过作为参数传递的行数.如此多的线条,更多的时间.就那么简单.