我有查询以按页码获取记录,如下所示
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)。看起来查询前端记录比后面的记录快得多。或者查询中有什么问题吗?
答案 0 :(得分:5)
正如文档所述Offset Fetch(大胆强调我的):
OFFSET { integer_constant | offset_row_count_expression } { ROW | ROWS }
指定在开始返回行之前要跳过的行数 来自查询表达式。 OFFSET子句的参数可以是整数 或表达式大于或等于零。你可以使用ROW 和ROWS可互换。
这意味着将获取所有行,但跳过作为参数传递的行数。如此多的线条,更多的时间。就这么简单。