sql分页存储过程比较
一,先创建一百万条数据
--
drop table #tmp
create table #tmp
(
id int identity(1,1) primary key,
name varchar(20)
)
declare @i int
set @i = 0
while @i<1000000
begin
insert into #tmp
select 'abc'+ cast(@i as varchar)
set @i = @i + 1
end
二,测试
1,not in
declare @PageIndex int ,@PageSize int
declare @timediff datetime
set @PageIndex =1000
set @PageSize = 10
set @timediff = getdate()
select top(@PageSize) id,name from #tmp
where id not in(
select top (@PageSize * (@PageIndex -1))id from #tmp
order by id)
order by id
select datediff(ms,@timediff,getdate())
2,max
--max
declare @PageIndex int ,@PageSize int
declare @timediff datetime
set @PageIndex =50000
set @PageSize = 10
set @timediff = getdate()
select top(@PageSize) id,name from #tmp
where id >(
select max(id) as id from(
select top (@PageSize * (@PageIndex -1)) id as id from #tmp
order by id) a )
order by id
select datediff(ms,@timediff,getdate())
3,rowNumber
--rownumber
declare @PageIndex int ,@PageSize int
declare @timediff datetime
set @PageIndex =100000
set @PageSize = 10
set @timediff = getdate();
with cte as
(
select *,row_number() over(order by id) as rowNo from #tmp
)
select * from cte
where rowNo between (@PageIndex -1)*@PageSize and @PageIndex*@PageSize
select datediff(ms,@timediff,getdate())
4,表中有多个主键时,top的写法要注意,而rowNumber则不存在这个问题。
-- top 多个主键是不能用not in,只好用not exists
declare @PageIndex int ,@PageSize int
set @PageIndex = 10000
set @PageSize = 10; select top (@PageSize) * from dbo.DQuestionData a
where not exists (
select 1
from
(select top ((@PageIndex-1) * @PageSize) * from dbo.DQuestionData order by SHOP_NO) b
where a.ANS_DATETIME = b.ANS_DATETIME
and a.SHOP_NO = b.SHOP_NO
and a.TERMINAL_ID = b.TERMINAL_ID
and a.ANS_POSITION = b.ANS_POSITION
and a.QUESTION = b.QUESTION
and a.ANSWER = b.ANSWER )
order by SHOP_NO; -- ROW_NUMBER()
declare @PageIndex int ,@PageSize int,@timediff datetime
set @PageIndex = 10000
set @PageSize = 10;
set @timediff = GETDATE();
with cte_tmp as
(
select *,ROW_NUMBER() over(order by SHOP_NO) as rowNo
from (
select * from dbo.DQuestionData
) a
)
select * from cte_tmp
where rowNo between (@PageIndex -1) * @PageSize + 1 and @PageIndex * @PageSize
select DATEDIFF(ms,@timediff,getdate())
5 ,用rownumber定义一个可以返回页数的存储过程
create procedure GetPaging
(
@PageIndex int = 1,
@PageSize int = 10,
@PageCount int output
)
as
begin
select @PageCount = ceiling(count(*) /cast(@PageSize as float)) from testTable;
with cte as
(
select top (@PageSize * (@PageIndex -1))id from testTable
order by id
)
select top(@PageSize) id,name from testTable
where id not in(
select id from cte)
order by id
end
三,结论
1,not in 随着PageIndex增大,速度越慢,不可用。另:如果用exec(@sql)的方式执行,速度就很快,不知道啥原因。
2,max如果用到索引列,数度很快,随着PageIndex增大,有小幅变慢。
3,rownumber速度适中,并且基本是匀速的,且适用范围广,写法简单。
平常应用,rownumber是最合适之选。
sql分页存储过程比较的更多相关文章
- [转]关于SQL分页存储过程的分析
[转]关于SQL分页存储过程的分析 建立一个 Web 应用,分页浏览功能必不可少.这个问题是数据库处理中十分常见的问题.经典的数据分页方法是:ADO 纪录集分页法,也就是利用ADO自带的分页功能(利用 ...
- Delphi调用SQL分页存储过程实例
Delphi调用SQL分页存储过程实例 (-- ::)转载▼ 标签: it 分类: Delphi相关 //-----下面是一个支持任意表的 SQL SERVER2000分页存储过程 //----分页存 ...
- 完整SQL分页存储过程(支持多表联接)
http://www.cnblogs.com/andiki/archive/2009/03/24/1420289.html Code/********************************* ...
- 真正通用的SQL分页存储过程
关于SQL分页的问题,网上找到的一些SQL其实不能真正做到通用,他们主要是以自增长ID做为前提的.但在实际使用中,很多表不是自增长的,而且主键也不止一个字段,其实我们稍做改进就可以达到通用.这里还增加 ...
- 关于SQL分页存储过程的分析
建 立一个 Web 应用,分页浏览功能必不可少.这个问题是数据库处理中十分常见的问题.经典的数据分页方法是:ADO 纪录集分页法,也就是利用ADO自带的分页功能(利用游标)来实现分页.但这种分页方法仅 ...
- SQL - 分页存储过程
http://www.jb51.net/article/71193.htm http://www.webdiyer.com/utils/spgenerator/ create PROCEDURE [d ...
- 修改后的SQL分页存储过程,利用2分法,支持排序
/****** Object: StoredProcedure [dbo].[sys_Page_v3] Script Date: 08/13/2014 09:32:28 ******/ SET ANS ...
- MS SQL 分页存储过程
最近换了家新公司,但是新公司没有使用分页的存储过程.那我就自个写一个往项目上套 (效率怎么样就不怎么清楚没有详细的测试过) CREATE PROCEDURE [dbo].[pro_common_pag ...
- sql分页存储过程,带求和、排序
创建存储过程: CREATE PROCEDURE [dbo].[sp_TBTest_Query] ( @PageSize INT, --每页多少条记录 @PageIndex INT = 1, --指定 ...
随机推荐
- sql server中QUOTENAME()函数的用法
操作sql server尤其是写存储过程时,要用到各种各样的函数,今天就总结一个quotename()的用法. 1.语法: quotename('character_string'[,'quote_c ...
- MPU6050陀螺仪和加速度计的校准
加速度计和陀螺仪的校准: 在传感器静止不动水平放置时,测出陀螺仪和加速度计各轴的偏移值,保存.以后每次上电调用dmp_set_xx_bias()就行了. u8 run_self_test(void) ...
- jQuery的prop和attr的区别,及判断复选框是否选中
jQuery的prop和attr的区别 对于HTML元素本身就带有的固有属性,在处理时,使用prop方法. 对于HTML元素我们自己自定义的DOM属性,在处理时,使用attr方法. 参数有区别,att ...
- [转] Java DecimalFormat 用法
我们经常要将数字进行格式化,比如取2位小数,这是最常见的.Java 提供 DecimalFormat 类,帮你用最快的速度将数字格式化为你需要的样子.下面是一个例子: importjava.text. ...
- Docker 建立镜像流程
1.docker build from dockerfile http://www.runoob.com/docker/docker-build-command.html $ docker build ...
- 解决 SQL Server 所有帐号无 sysadmin 权限,且未启用 SQL Server 身份验证,sa 帐号也未启用的问题
解决 未启用 SQL Server 身份验证 的问题: 1. 运行 regedit,进入注册表编辑器 2. 打开:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Micro ...
- [转]:Android 5.0的调度作业JobScheduler
参考:http://blog.csdn.net/cuiran/article/details/42805057 增加 JobScheduler 的同时,去掉了几个广播, CONNECTIVITY_AC ...
- VS2015中运行ASPX老项目出错HTTP Error 500.23 - Internal Server Error错误
今天翻出以前用VS2010做的老项目,在VS2015中运行ASPX页面浏览,出现错误: HTTP Error 500.23 - Internal Server Error 检测到在集成的托管管道模式下 ...
- WebClient请求帮助类
/// <summary> /// 通过JSON方式发送POST请求 /// 将返回结果按JSON方式解析 /// </summary> public static class ...
- 定义log_query_time的值
默认超过10秒的sql才会被记录在慢查询日志里.可以通过long_query_time控制.如果是临时修改:set global long_query_time=4;(把超过4秒的sql记录到慢查询日 ...