SQL Server分页的存储过程写法以及性能比较
------创建数据库data_Test -----create database data_TestGOuse data_TestGOcreate table tb_TestTable --创建表(id int identity(1,1) primary key,userName nvarchar(20) not null,userPWD nvarchar(20) not null,userEmail nvarchar(40) null)GO------插入数据------set identity_insert tb_TestTable ondeclare @count intset @count=1while @count<=2000000begininsert into tb_TestTable(id,userName,userPWD,userEmail) values(@count,'admin','admin888','lli0077@yahoo.com.cn')set @count=@count+1endset identity_insert tb_TestTable off---1、利用select top 和select not in进行分页,具体代码如下create procedure proc_paged_with_notin --利用select top and select not in(@pageIndex int, --页索引@pageSize int --每页记录数)asbeginset nocount on;declare @timediff datetime --耗时declare @sql nvarchar(500)select @timediff=Getdate()set @sql='select top '+str(@pageSize)+' * from tb_TestTable where(ID not in(select top '+str(@pageSize*@pageIndex)+' id from tb_TestTable order by ID ASC)) order by ID'execute(@sql) --因select top后不支技直接接参数,所以写成了字符串@sqlselect datediff(ms,@timediff,GetDate()) as 耗时set nocount off;end---2、利用select top 和 select max(列键)---create procedure proc_paged_with_selectMax --利用select top and select max(列)(@pageIndex int, --页索引@pageSize int --页记录数)asbeginset nocount on;declare @timediff datetimedeclare @sql nvarchar(500)select @timediff=Getdate()set @sql='select top '+str(@pageSize)+' * From tb_TestTable where(ID>(select max(id) From (select top '+str(@pageSize*@pageIndex)+' id From tb_TestTable order by ID) as TempTable)) order by ID'execute(@sql)select datediff(ms,@timediff,GetDate()) as 耗时set nocount off;end---3、利用select top和中间变量--此方法因网上有人说效果最佳---create procedure proc_paged_with_Midvar --利用ID>最大ID值和中间变量(@pageIndex int,@pageSize int)asdeclare @count intdeclare @ID intdeclare @timediff datetimedeclare @sql nvarchar(500)beginset nocount on;select @count=0,@ID=0,@timediff=getdate()select @count=@count+1,@ID=case when @count<=@pageSize*@pageIndex then ID else @ID end from tb_testTable order by idset @sql='select top '+str(@pageSize)+' * from tb_testTable where ID>'+str(@ID)execute(@sql)select datediff(ms,@timediff,getdate()) as 耗时set nocount off;end---4、利用Row_number() 此方法为SQL server 2005中新的方法,利用Row_number()给数据行加上索引create procedure proc_paged_with_Rownumber --利用SQL 2005中的Row_number()(@pageIndex int,@pageSize int)asdeclare @timediff datetimebeginset nocount on;select @timediff=getdate()select * from (select *,Row_number() over(order by ID asc) as IDRank from tb_testTable) as IDWithRowNumber whereIDRank>@pageSize*@pageIndex and IDRank<@pageSize*(@pageIndex+1)select datediff(ms,@timediff,getdate()) as 耗时set nocount off;end---5、利用临时表及Row_numbercreate procedure proc_CTE --利用临时表及Row_number(@pageIndex int, --页索引@pageSize int --页记录数)asset nocount on;declare @ctestr nvarchar(400)declare @strSql nvarchar(400)declare @datediff datetimebeginselect @datediff=GetDate()set @ctestr='with Table_CTE as(select ceiling((Row_number() over(order by ID ASC))/'+str(@pageSize)+') as page_num,* from tb_TestTable)';set @strSql=@ctestr+' select * From Table_CTE where page_num='+str(@pageIndex)endbeginexecute sp_executesql @strSqlselect datediff(ms,@datediff,GetDate())set nocount off;end |
存储过程的5种分页写法,下面的代码是从忘了什么时候从别人那Ctrl+C来的,所以仅仅作为收藏,希望作者看到不要喷我.
SQL Server分页的存储过程写法以及性能比较的更多相关文章
- SQL Server分页查询存储过程
--分页存储过程create PROCEDURE [dbo].[commonPagination]@columns varchar(500), --要显示的列名,用逗号隔开 @tableName va ...
- 理解性能的奥秘——应用程序中慢,SSMS中快(2)——SQL Server如何编译存储过程
本文属于<理解性能的奥秘--应用程序中慢,SSMS中快>系列 接上文:理解性能的奥秘--应用程序中慢,SSMS中快(1)--简介 本文介绍SQL Server如何编译存储过程并使用计划缓存 ...
- SQL Server游标 C# DataTable.Select() 筛选数据 什么是SQL游标? SQL Server数据类型转换方法 LinQ是什么? SQL Server 分页方法汇总
SQL Server游标 转载自:http://www.cnblogs.com/knowledgesea/p/3699851.html. 什么是游标 结果集,结果集就是select查询之后返回的所 ...
- SQL server分页的四种方法
SQL server分页的四种方法 1.三重循环: 2.利用max(主键); 3.利用row_number关键字: 4.offset/fetch next关键字 方法一:三重循环思路 先取前20页, ...
- SQL server分页的四种方法(算很全面了)
这篇博客讲的是SQL server的分页方法,用的SQL server 2012版本.下面都用pageIndex表示页数,pageSize表示一页包含的记录.并且下面涉及到具体例子的,设定查询第2 ...
- SQL Server基础之存储过程
简单来说,存储过程就是一条或者多条sql语句的集合,可视为批处理文件,但是其作用不仅限于批处理.本篇主要介绍变量的使用,存储过程和存储函数的创建,调用,查看,修改以及删除操作. 一:存储过程概述 ...
- SQL SERVER 临时表导致存储过程重编译(recompile)的一些探讨
SQLSERVER为了确保返回正确的值,或者处于性能上的顾虑,有意不重用缓存在内存里的执行计划,而重新编译执行计划的这种行为,被称为重编译(recompile).那么引发存储过程重编译的条件有哪一些呢 ...
- 【SQL Server】SQL Server基础之存储过程
SQL Server基础之存储过程 阅读目录 一:存储过程概述 二:存储过程分类 三:创建存储过程 1.创建无参存储过程 2.修改存储过程 3.删除存储过程 4.重命名存储过程 5.创建带参数的存储 ...
- SQL SERVER 分页方法
最近项目中需要在SQL SERVER中进行分页,需要编写分页查询语句.之前也写过一些关于分页查询的语句,但是性能不敢恭维.于是在业务时间,在微软社区Bing了一篇老外写的关于SQL SERVER分页的 ...
随机推荐
- 图片上传(3)(组件 -- 图片大小宽高限制)base64图片宽高读取
1.上传组件(可上传多个文件) <template> <div class="attachmentN"> <span class="btnS ...
- JavaJDBC【五、事务】
概念: 事务(Transaction)作为单个逻辑工作单元执行的一系列操作. 这些操作都是作为一个整体一起向系统提交,要么都执行,要么都不执行. 特点: 原子性:一个完整操作. 一致性:当事务完成时, ...
- 第一章·ELKstack介绍及Elasticsearch部署
一.ELKstack课程大纲  二.ELKstack简介 什么是ELK? 通俗来讲,ELK是由Elasticsearch.Logstash.Kibana 三个开源软件的组成的一个组合体,这三个软件当 ...
- yocto project user’s guide
http://www.yoctoproject.org/docs/2.1/ref-manual/ref-manual.html 参考手册 http://www.yoctoproject.org/doc ...
- markdown实现点击链接下载文件
今天用Markdown工具,需要实现一个点连接下载文件的功能,看起来很多简单我也没多想就直接写了,并且单个页面测试的时候也挺正常,就发布了,但是发布后使用的时候发现问题了,浏览器中直接点击链接没反应, ...
- Python库整理
库名称简介 Chardet字符编码探测器,可以自动检测文本.网页.xml的编码. colorama主要用来给文本添加各种颜色,并且非常简单易用. Prettytable主要用于在终端或浏览器端构建格式 ...
- R树-javascript代码实现过程分析(插入操作)
R Tree 第一步,创建R树类. 构建一个RTree生成器.用以创建tree对象. 例子:var tree = new RTree(12) var RTree = function(width){ ...
- pycharm 如何自动添加头注释,比如时间,作者信息等
查找路径:File->settings->Editor->File and Code Templates->Python Script #!/usr/bin/env pytho ...
- strace分析启动流程
strace -ttt /usr/local/mysql/bin/mysqld 2>&1 |tee 1.log vi 1.log 1 1530183737.761709 execve(& ...
- New!Devexpress WPF各版本支持VS和SQL Server版本对应图
点击获取DevExpress v19.2.3完整版试用下载 本文主要为大家介绍DevExpress WPF各大版本支持的VS版本和支持的.Net版本图,Devexpress WPF v19.2.3日前 ...