sqlserver 分页方法

本文分别介绍三种sqlserver分页方式。并开启statistics做为统计。

开启统计:

--清理
DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE
--开启统计信息
SET STATISTICS TIME ON
SET STATISTICS IO ON

使用top

方法一:

优点:通用,第一页可以直接把第二个数字2设置为0即可。统计结果表明,主要的性能消耗在IO上。对比了方法二后,建议如果坚持使用top,还是用【方法二】会比较好——方法二的逻辑读取次数会小很多。

缺点:两层嵌套,对于大表还是压力很大的。而且读取次数很多。

DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE
--开启统计信息
SET STATISTICS TIME ON
SET STATISTICS IO ON

SELECT TOP 2 * FROM vvtest WHERE ID NOT IN --这里的2:每页展示的数量
(SELECT TOP 2 ID FROM vvtest ORDER BY id) --这里的2=页码*每页展示的数量,这里是1*2。
ORDER BY id

方法二(如用top时,建议使用):

优点:逻辑比较直白的,适合小白入门。逻辑读取次数不会根据页码不同而变。查看统计结果后,主要的性能消耗还是在IO。

缺点:脚本三层嵌套很冗余。而且第一页的脚本不能复用。要单独写。

DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE
--开启统计信息
SET STATISTICS TIME ON
SET STATISTICS IO ON

select top 2 id,name from vvtest where id>=--这里的2是每页展示的数量
(select max(id) from (select top 2 id from vvtest order by id ) --这里的2=页码*每页数量,页码不能为0
tmp_max_table)order by id 

 

使用row_number

优点:性能比top方式好。

缺点:还是需要使用两层嵌套。代码看起来会较复杂。而且执行起来发现性能变化还蛮大的,主要变化在IO消耗的时间上。(下图的统计信息只是其中一次。不作为比较性能的直接证据)

DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE
--开启统计信息
SET STATISTICS TIME ON
SET STATISTICS IO ON

select top 2 * --这里的2是每页展示的数量
from (select row_number() 
over(order by id asc) as rownumber,* 
from vvtest) temp_row
where rownumber>((1-1)*2);--这里对应的公式是:(页码-1)*每页展示的数量,页码从1开始。

 

使用row fetch next

优:代码很简单。

缺:sqlserver 2012版本以上才能使用。

DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE
--开启统计信息
SET STATISTICS TIME ON
SET STATISTICS IO ON

SELECT [id]
      ,[name]
  FROM [master].[dbo].[vvtest]
  order by name  desc offset (3-1)*2 row fetch next 2 row only --这里对应的公式是:(页码-1)*每页展示的数量,页码从1开始。

 

 

展开阅读全文

没有更多推荐了,返回首页