SET STATISTICS IO ON
SET STATISTICS TIME ON
DECLARE @pageIndex INT=800,@pageSize INT=20
SELECT * FROM Person.Person AS t
ORDER BY t.lastname
OFFSET (@pageIndex-1)*@pageSize ROWS
FETCH NEXT @pageSize ROWS ONLY;
/*
---------- @pageIndex=1 ----------
(20 行受影响)
表 'Person'。扫描计数 1,逻辑读取 65 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
SQL Server 执行时间:
CPU 时间 = 0 毫秒,占用时间 = 43 毫秒。
---------- @pageIndex=2 ----------
(20 行受影响)
表 'Person'。扫描计数 1,逻辑读取 125 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
SQL Server 执行时间:
CPU 时间 = 0 毫秒,占用时间 = 106 毫秒。
---------- @pageIndex=800 ----------
(20 行受影响)
表 'Person'。扫描计数 1,逻辑读取 49088 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
SQL Server 执行时间:
CPU 时间 = 63 毫秒,占用时间 = 175 毫秒。
是我想说的是被好多人所不关注的一种分页方法:
select * from 表 order by id OFFSET PageIndex*pagenum ROWS FETCH next pagenumrows only
这种方法是不是很简单,但是这个只有在SQL Server 2012及以上版本中才能使用,无论是从逻辑读取数还是响应时间、实际执行行数等关键参数看,SQL Server 2012提供的OFFSET/FETCH NEXT分页方式都比Row_Number()方式有了较大的提升。
注意:使用该方法必须使用order by ,不然会有语法错误。
SELECT * FROM Article_Admin ORDER BY ID DESC OFFSET (2-1)*10 ROWS FETCH NEXT 10 ROWS ONLY
(2-1)*10相当于 (pageIndex当前页码-1)*pageSize每页显示的条数
10相当于pageSize每页显示的条数