Sql Server 多种分页性能比较


本文摘自博客园,原文链接:https://www.cnblogs.com/xwc1996/p/9113049.html。

Sql Server多种分页性能的比较

一.前言

因为工作关系,遇到了非常大的数据量的分页问题,数据总共有8000万吧,这个显然不是简单的分页能够解决的,需要从多多方面考虑,从分表、分库等等。

但是这个也让我考虑到了分页性能的问题,在不同数据量的情况下,不同的分页方法效率是否会有不同。

我在这里用比较常见的几种分页方法在不同的数据量、不同页码下进行对比,分别是:TopRow_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:

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才支持了。

二.20W数据量

1.Top

第1页十次执行平均时间29.1毫秒。

Sql Server 多种分页性能比较

第1万页十次执行平均时间109.2毫秒。

Sql Server 多种分页性能比较

第2万页十次执行平均时间126.8毫秒。

Sql Server 多种分页性能比较

2.Row_Number()

第1页十次执行平均时间20.2毫秒。

Sql Server 多种分页性能比较

第1万页十次执行平均时间96.5毫秒。

Sql Server 多种分页性能比较

第2万页十次执行平均时间153.8毫秒。

Sql Server 多种分页性能比较

3.Offset Fecth

第1页十次执行平均时间19.3毫秒。

Sql Server 多种分页性能比较

第1万页十次执行平均时间70毫秒。

Sql Server 多种分页性能比较

第2万页十次执行平均时间75.1毫秒。

Sql Server 多种分页性能比较

三.200W数据量

1.Top

第1页十次执行平均时间55.9毫秒。

Sql Server 多种分页性能比较

第10万页十次执行平均时间.....毫秒。

执行了好几十秒。。。。直接淘汰。

2.Row_Number()

第1页十次执行平均时间25.5毫秒

Sql Server 多种分页性能比较

第10万页十次执行平均时间642.3毫秒

Sql Server 多种分页性能比较

第20万页十次执行平均时间1257毫秒

Sql Server 多种分页性能比较

3.Offset Fecth

第1页十次执行平均时间24.7毫秒

Sql Server 多种分页性能比较

第10万页十次执行平均时间220.5毫秒

Sql Server 多种分页性能比较

第20万页十次执行平均时间396毫秒

Sql Server 多种分页性能比较

三.2000W数据量

1.Top

因为在上一轮被淘汰了,所以这一轮就算了。。  

2.Row_Number()

第1页十次执行平均时间57毫秒

Sql Server 多种分页性能比较

第100W页十次执行平均时间6401.5毫秒

Sql Server 多种分页性能比较

第200W页十次执行平均时间14606.2毫秒

Sql Server 多种分页性能比较

3.Offset Fecth

第1页十次执行平均时间27.5毫秒

Sql Server 多种分页性能比较

第100W页十次执行平均时间1778.9毫秒

Sql Server 多种分页性能比较

第200W页十次执行平均时间3523.2毫秒

Sql Server 多种分页性能比较

四.总结

可以看出来数据量越大、分页页码越大对分页效率影响就越大。

top的分页方法早早出局,很明显是因为not in 的数据量太庞大了,所以要是有好的top分页方法可以下面留言,我也会进行测试。

row_number的分页方法算是比较好的了,而且sql2005及以上的数据库都可以用,受众范围比较大,而offset fecth的性能更加优越,但是只有sql2012及以上的才支持。

有什么问题欢迎讨论!

相关阅读 >>

sql server 使用sql语句查询表的数据字典

sql server智能提示格式化sql代码工具-sqlprompt

microsoft sql server 各版本汇总下载地址(附激活码)

sql server 多种分页性能比较

sql server查看表中已存在的索引

更多相关阅读请进入《sql server》频道 >>


数据库系统概念 第6版
书籍

数据库系统概念 第6版

机械工业出版社

本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...