一.前言

  因为工作关系,遇到了非常大的数据量的分页问题,数据总共有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:

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毫秒。

    

    第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及以上的才支持。

  有什么问题欢迎讨论!

    

Sql Server多种分页性能的比较的更多相关文章

  1. SQL Server 多种分页查询效率

    关于SQL语句分页,网上也有很多,我贴一部分过来,并且总结自己已知的分页到下面,方便日后查阅. 方法1 适用于 SQL Server 任何版本 SELECT TOP 页大小 * FROM table1 ...

  2. 浅谈SQL Server数据库分页

    数据库分页是老生常谈的问题了.如果使用ORM框架,再使用LINQ的话,一个Skip和Take就可以搞定.但是有时由于限制,需要使用存储过程来实现.在SQLServer中使用存储过程实现分页的已经有很多 ...

  3. SQL Server添加MDW性能监控报表(转载)

    10.2 Data Collector与MDW Data Collection功能是SQL SERVER 2005版本提供的数据库监控报表的功能,通过定时地对数据库的语句运行情况,服务器各种资源的监控 ...

  4. hibernate 对 sql server 2005 分页改进

    Hibernate 可以实现分页查询 如下 Query q = session.createQuery("from Cat as c"); q.setFirstResult(100 ...

  5. windows系统与SQL SERVER 2008数据库服务性能监控分析简要

    软件系统性能测试体系流程介绍之windows系统与SQL SERVER 2008数据库服务性能监控分析简要 目前大部分测试人员对操作系统资源.中间件.数据库等性能监控分析都是各自分析各自的监控指标方式 ...

  6. SQL Server 存储过程分页

    每每面试,总会有公司问到分页.在下不才,在这里写几种分页,望路过的各位大神尽情拍砖. 先从创建数据库说起.源码如下 一.创建数据库 /********************************* ...

  7. SQL Server 常用分页SQL

    今天无聊和朋友讨论分页,发现网上好多都是错的.网上经常查到的那个Top Not in 或者Max 大部分都不实用,很多都忽略了Order和性能问题.为此上网查了查,顺带把2000和2012版本的也补上 ...

  8. SQL Server 常用分页SQL(转)

    发现网上好多都是错的.网上经常查到的那个Top Not in 或者Max 大部分都不实用,很多都忽略了Order和性能问题.为此上网查了查,顺带把2000和2012版本的也补上了. 先说说网上常见SQ ...

  9. SQL Server 数据分页查询

    最近学习了一下SQL的分页查询,总结了以下几种方法. 首先建立了一个表,随意插入的一些测试数据,表结构和数据如下图: 现在假设我们要做的是每页5条数据,而现在我们要取第三页的数据.(数据太少,就每页5 ...

随机推荐

  1. IEnumerable<T> 用法

    //以下参考来自 http://www.cnblogs.com/wilber2013/p/4299529.html

  2. python--json和pickle序列化

    字符串存储 一般需要有信息需要记录的都写到文件上面,把要记录的信息转成字符串,然后在写入到文件中.这算是一种记录方式. 比如有一组用户信息需要存起来.数据定义好之后就可以写文件. info = { ' ...

  3. msql 综合练习

    8.统计列印各科成绩,各分数段人数:  课程ID,课程名称,[100-85],[85-70],[70-60],[<60] 尽管表面看上去不那么容易,其实用 CASE 可以很容易地实现: SELE ...

  4. DVB数字电视常见信号指标解释

    1. 平均功率与峰值电平       峰值电平在模拟电视广播时用于表征频道信号电平强弱. 模拟电视信号是单极性.不对称的,即电视信号有一个固定黑色参考电平,比黑色亮的信号处在黑色电平线一边,同步脉冲处 ...

  5. 常用HTML富文本编辑器

    常用的HTML富文本编译器UEditor.CKEditor.TinyMCE.HTMLArea.eWebEditor.KindEditor简介   这篇文章主要介绍了常用的HTML富文本编译器UEdit ...

  6. C#多线程Thread

    在项目中经常用到线程Thread,先做个简单记录,后面再完善下,方便以后参考.本人技术有限,如有不同见解之处,欢迎博友批评指正. 执行的线程Thread分无参数的,一个参数,多个参数的.直接看代码吧. ...

  7. Lubuntu , ubuntu 搜索文件

    使用命令行方式搜索 $ locate your_filename

  8. Linux终端(terminal)清屏命令

    windows CMD终端的清屏命令是cls Linux终端中的清屏命令有 1) clear 2) reset

  9. ring0 SSDTHook 实现x64/x86

    #include "HookSSDT.h" #include <ntimage.h> #define SEC_IMAGE 0x001000000 ULONG32 __N ...

  10. 深入了解MongoDB

    一.介绍: 数据库分为关系型数据库和非关系型数据库 关系型数据库是建立在关系模型上的数据库,主要的有Oracle MySQL Microsoft SQL Server NoSQL是非关系型数据存储的广 ...