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