一.前言sql
由于工做关系,遇到了很是大的数据量的分页问题,数据总共有8000万吧,这个显然不是简单的分页可以解决的,须要从多多方面考虑,从分表、分库等等。可是这个也让我考虑到了分页性能的问题,在不一样数据量的状况下,不一样的分页方法效率是否会有不一样。我在这里用比较常见的几种分页方法在不一样的数据量、不一样页码下进行对比,分别是:Top、Row_Number()和Offset Fetch。这里只用它们分别最简单的语句,以下。数据库
Top:性能
create proc Tops @pageindex int,@pagesize int AS BEGIN select top (@pagesize) * from Customers where CustomerID not in (select top ((@pageindex - 1)* @pagesize) CustomerID from Customers order by CustomerID DESC) order by CustomerID DESC END
Row_Number():测试
create proc RowNumber @pageindex int,@pagesize int AS BEGIN select * from (select ROW_NUMBER() OVER(order by CustomerID desc) as px,* from Customers) as a where a.px between ((@pageindex - 1)* @pagesize + 1) and (@pageindex*@pagesize) END
Offset Fetch:fetch
create proc Offset_Fetch @pageindex int,@pagesize int AS BEGIN select * from Customers order by CustomerID desc offset ((@pageindex - 1) * @pagesize) rows fetch next @pagesize rows only END
三个存储过程都对数据进行了排序,设置的语句相对公平,这里默认每页10条数据。Top的分页是基本上全部的版本的sql server均可以使用的,row_number()是sql 2005以上,offset fetch须要sql 2012才支持了。spa
二.20W数据量code
1.Topserver
第1页十次执行平均时间29.1毫秒。blog
第1万页十次执行平均时间109.2毫秒。
排序
第2万页十次执行平均时间126.8毫秒。
2.Row_Number()
第1页十次执行平均时间20.2毫秒。
第1万页十次执行平均时间96.5毫秒。
第2万页十次执行平均时间153.8毫秒。
3.Offset Fecth
第1页十次执行平均时间19.3毫秒。
第1万页十次执行平均时间70毫秒。
第2万页十次执行平均时间75.1毫秒。
三.200W数据量
1.Top
第1页十次执行平均时间55.9毫秒。
第10万页十次执行平均时间.....毫秒。
执行了好几十秒。。。。直接淘汰
2.Row_Number()
第1页十次执行平均时间25.5毫秒
第10万页十次执行平均时间642.3毫秒
第20万页十次执行平均时间1257毫秒
3.Offset Fecth
第1页十次执行平均时间24.7毫秒
第10万页十次执行平均时间220.5毫秒
第20万页十次执行平均时间396毫秒
三.2000W数据量
1.Top
由于在上一轮被淘汰了,因此这一轮就算了。。
2.Row_Number()
第1页十次执行平均时间57毫秒
第100W页十次执行平均时间6401.5毫秒
第200W页十次执行平均时间14606.2毫秒
3.Offset Fecth
第1页十次执行平均时间27.5毫秒
第100W页十次执行平均时间1778.9毫秒
第200W页十次执行平均时间3523.2毫秒
四。总结
能够看出来数据量越大、分页页码越大对分页效率影响就越大。top的分页方法早早出局,很明显是由于not in 的数据量太庞大了,因此要是有好的top分页方法能够下面留言,我也会进行测试。row_number的分页方法算是比较好的了,并且sql2005及以上的数据库均可以用,受众范围比较大,而offset fecth的性能更加优越,可是只有sql2012及以上的才支持。
有什么问题欢迎讨论!