Sql Server多种分页性能的比较
一.前言
因为工作关系,遇到了非常大的数据量的分页问题,数据总共有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多种分页性能的比较的更多相关文章
- SQL Server 多种分页查询效率
		
关于SQL语句分页,网上也有很多,我贴一部分过来,并且总结自己已知的分页到下面,方便日后查阅. 方法1 适用于 SQL Server 任何版本 SELECT TOP 页大小 * FROM table1 ...
 - 浅谈SQL Server数据库分页
		
数据库分页是老生常谈的问题了.如果使用ORM框架,再使用LINQ的话,一个Skip和Take就可以搞定.但是有时由于限制,需要使用存储过程来实现.在SQLServer中使用存储过程实现分页的已经有很多 ...
 - SQL Server添加MDW性能监控报表(转载)
		
10.2 Data Collector与MDW Data Collection功能是SQL SERVER 2005版本提供的数据库监控报表的功能,通过定时地对数据库的语句运行情况,服务器各种资源的监控 ...
 - hibernate 对 sql server 2005 分页改进
		
Hibernate 可以实现分页查询 如下 Query q = session.createQuery("from Cat as c"); q.setFirstResult(100 ...
 - windows系统与SQL SERVER 2008数据库服务性能监控分析简要
		
软件系统性能测试体系流程介绍之windows系统与SQL SERVER 2008数据库服务性能监控分析简要 目前大部分测试人员对操作系统资源.中间件.数据库等性能监控分析都是各自分析各自的监控指标方式 ...
 - SQL Server 存储过程分页
		
每每面试,总会有公司问到分页.在下不才,在这里写几种分页,望路过的各位大神尽情拍砖. 先从创建数据库说起.源码如下 一.创建数据库 /********************************* ...
 - SQL Server 常用分页SQL
		
今天无聊和朋友讨论分页,发现网上好多都是错的.网上经常查到的那个Top Not in 或者Max 大部分都不实用,很多都忽略了Order和性能问题.为此上网查了查,顺带把2000和2012版本的也补上 ...
 - SQL Server 常用分页SQL(转)
		
发现网上好多都是错的.网上经常查到的那个Top Not in 或者Max 大部分都不实用,很多都忽略了Order和性能问题.为此上网查了查,顺带把2000和2012版本的也补上了. 先说说网上常见SQ ...
 - SQL Server 数据分页查询
		
最近学习了一下SQL的分页查询,总结了以下几种方法. 首先建立了一个表,随意插入的一些测试数据,表结构和数据如下图: 现在假设我们要做的是每页5条数据,而现在我们要取第三页的数据.(数据太少,就每页5 ...
 
随机推荐
- Gremlin--一种支持对图表操作的语言
			
Gremlin 是操作图表的一个非常有用的图灵完备的编程语言.它是一种Java DSL语言,对图表进行查询.分析和操作时使用了大量的XPath. Gremlin可用于创建多关系图表.因为图表.顶点和边 ...
 - 最小正子序列(序列之和最小,同时满足和值要最小)(数据结构与算法分析——C语言描述第二章习题2.12第二问)
			
#include "stdio.h" #include "stdlib.h" #define random(x) (rand()%x) void creat_a ...
 - Asp.Net实现伪静态(通过URLRewriter)
			
一.起因 最近一个项目要实现伪静态,之前没接触过,故一切从零开始,开始网上查资料,方法大概有三种,但是我都试了好几个,都失败了.望有建议的博友给点建议,这里我实现了一种方式,是通过微软URLRewri ...
 - Element-ui(el-table、el-pagination)实现表格分页
			
HTML代码:(重点关注el-table中:data数据的绑定) el-pagination中: layout代表组件布局,子组件名用逗号分隔 属性: total代表总条目数 事件: current- ...
 - Node.js-sublime text3 配置node.js(ERROR: The process "node.exe" not found.)
			
默认已经安装好sublime.node和npm 1.sublime的node.js插件下载 由于在package control上经常下载失败,所以这里直接从GitHub上进行下载! GitHub下载 ...
 - xampp中mysql重置root密码
			
1. 停止mysql:用图形化工具或者在cmd命令下输入net stop mysql,在c盘根目录下输入 2. 打开cmd,切换目录到 /xampp/mysql/bin, 运行 mysqld ...
 - MySQL入门很简单:  8查询数据
			
1. 查询语句语法 SELECT 属性列表 FROM 表名和视图列表 [WHERE 条件表达式1] [GROUP BY 属性名1 [HAVING t条件表达式2]] [ORDER BY 属性名2 [A ...
 - 进程—内存描述符(mm_struct)
			
http://blog.csdn.net/qq_26768741/article/details/54375524 前言 上一篇我们谈论了task_struct这个结构体,它被叫做进程描述符,内部成员 ...
 - node执行环境
			
nodejs本质上是一个javascript的执行环境,只是由于他的封装,加上更多web底层的一个处理,赋予了更多的能力,那么执行环境到底是什么呢,我们到浏览器里面体验看看,在chrome里面控制台, ...
 - python 爬取猫眼榜单100(二)--多个页面以及多进程
			
#!/usr/bin/env python # -*- coding: utf- -*- # @Author: Dang Kai # @Date: -- :: # @Last Modified tim ...