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

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时,运行时间少于1s,几乎是瞬间。
@PageNumber = 500时,运行时间约为4s。
@PageNumber = 1000时,运行时间少于12s。
@PageNumber = 2000时,运行时间少于20s。
@PageNumber = 3000时,运行时间少于28s。


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

最佳答案

正如文档所述,Offset Fetch(加粗强调):


OFFSET { integer_constant | offset_row_count_expression } { ROW | ROWS }


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


这意味着将提取所有行,但会跳过您作为参数传递的行数。如此多的行,更多的时间。就那么简单。

10-07 15:54