一,先创建一百万条数据

--
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分页存储过程比较的更多相关文章

  1. [转]关于SQL分页存储过程的分析

    [转]关于SQL分页存储过程的分析 建立一个 Web 应用,分页浏览功能必不可少.这个问题是数据库处理中十分常见的问题.经典的数据分页方法是:ADO 纪录集分页法,也就是利用ADO自带的分页功能(利用 ...

  2. Delphi调用SQL分页存储过程实例

    Delphi调用SQL分页存储过程实例 (-- ::)转载▼ 标签: it 分类: Delphi相关 //-----下面是一个支持任意表的 SQL SERVER2000分页存储过程 //----分页存 ...

  3. 完整SQL分页存储过程(支持多表联接)

    http://www.cnblogs.com/andiki/archive/2009/03/24/1420289.html Code/********************************* ...

  4. 真正通用的SQL分页存储过程

    关于SQL分页的问题,网上找到的一些SQL其实不能真正做到通用,他们主要是以自增长ID做为前提的.但在实际使用中,很多表不是自增长的,而且主键也不止一个字段,其实我们稍做改进就可以达到通用.这里还增加 ...

  5. 关于SQL分页存储过程的分析

    建 立一个 Web 应用,分页浏览功能必不可少.这个问题是数据库处理中十分常见的问题.经典的数据分页方法是:ADO 纪录集分页法,也就是利用ADO自带的分页功能(利用游标)来实现分页.但这种分页方法仅 ...

  6. SQL - 分页存储过程

    http://www.jb51.net/article/71193.htm http://www.webdiyer.com/utils/spgenerator/ create PROCEDURE [d ...

  7. 修改后的SQL分页存储过程,利用2分法,支持排序

    /****** Object: StoredProcedure [dbo].[sys_Page_v3] Script Date: 08/13/2014 09:32:28 ******/ SET ANS ...

  8. MS SQL 分页存储过程

    最近换了家新公司,但是新公司没有使用分页的存储过程.那我就自个写一个往项目上套 (效率怎么样就不怎么清楚没有详细的测试过) CREATE PROCEDURE [dbo].[pro_common_pag ...

  9. sql分页存储过程,带求和、排序

    创建存储过程: CREATE PROCEDURE [dbo].[sp_TBTest_Query] ( @PageSize INT, --每页多少条记录 @PageIndex INT = 1, --指定 ...

随机推荐

  1. Javascript MVC 学习笔记(一) 模型和数据

    写在前面 近期在看<MVC的Javascript富应用开发>一书.本来是抱着一口气读完的想法去看的.结果才看了一点就傻眼了:太多不懂的地方了. 仅仅好看一点查一点,一点一点往下看吧,进度虽 ...

  2. CentOS 7 安装以及配置

    http://blog.csdn.net/qzc295919009/article/details/42708653

  3. jQuery学习笔记(Ajax)

    jQuery对Ajax操作进行了封装,在jQuery中$.ajax方法属于最底层的方法,第2层是$.load().$.get().$.post()方法,第3层是$.getScript()和$.getJ ...

  4. IE报错:The given path's format is not supported

    在使用FileUpload控件进行上传EXCEL文件时,本地调试上传无问题,但是发布之后报地址无效错误 一.出现这个错误的主要原因是,在本地上传图片的时候HttpPostedFileBase对象里面保 ...

  5. Spark Streaming的接收KAFKA的数据

    https://github.com/lw-lin/CoolplaySpark/blob/master/Spark%20Streaming%20%E6%BA%90%E7%A0%81%E8%A7%A3% ...

  6. Spring Bean 的加载顺序

    一,单一Bean 装载 1. 实例化; 2. 设置属性值; 3. 如果实现了BeanNameAware接口,调用setBeanName设置Bean的ID或者Name; 4. 如果实现BeanFacto ...

  7. (转)使用异步Python 3.6和Redis编写快速应用程序

    转自:http://mp.weixin.qq.com/s?__biz=MjM5NzU0MzU0Nw==&mid=2651374524&idx=1&sn=d289aa7aa484 ...

  8. Window 分布式学习-好文收藏

    概述 最近.NET的世界开始闹腾了,微软官方终于加入到了对.NET跨平台的支持,并且在不久的将来,我们在VS里面写的代码可能就可以通过Mono直接在Linux和Mac上运行.那么大家(开发者和企业)为 ...

  9. visual c++中预定义的宏

    一.主要目标 (由于visual studio通常包含很多开发环境,通常将其中c/c++的ide称为visual c++ 20xx) 整理下visual c++ 2010下预定义的宏.做一下备忘和了解 ...

  10. js随机生成一个数组中的随机字符串以及更新验证码

    随机生成m,n范围的值得公式: Math.random()*(n-m)+m: 改正公式:Math.random()*(n+1-m)+m // 生成随机字符串function randomMixed(n ...