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

时间:2013-11-22 03:34:37

标签: sql sql-server tsql

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

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时,运行时间约为4秒。
  • @PageNumber = 1000时,运行时间小于12秒。
  • @PageNumber = 2000时,运行时间少于20秒。
  • @PageNumber = 3000时,运行时间小于28秒。

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

1 个答案:

答案 0 :(得分:5)

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

OFFSET { integer_constant | offset_row_count_expression } { ROW | ROWS }
     

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

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