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, --指定 ...
随机推荐
- Android开发:setAlpha()方法和常用RGB颜色表----颜色, r g b分量数值(int), 16进制表示 一一对应
杂家前文Android颜色对照表只有颜色和十六进制,有时候需要设置r g b分量的int值,如paint.setARGB(255, 127, 255, 212);就需要自己计算下分量的各个值.这里提供 ...
- Spring-MVC配置Gson做为Message Converter解析Json
Spring-MVC配置Gson做为Message Converter解析Json 在学习Spring的时候看到可以使用@RequestBody 和@ResponseBody注解来是的Spring自动 ...
- C#基础第二天-作业答案-九九乘法表-打印星星
题一:九九乘法表的答案 //正三角 ; i < ; i++) { ; j <= i; j++) { Console.Write("{0}*{1}={2} ", j, i ...
- python3 如何给装饰器传递参数
[引子] 之前写过一篇文章用来讲解装饰器(https://www.cnblogs.com/JiangLe/p/9309330.html) .那篇文章的定位是入门级的 所以也就没有讲过多的高级主题,决定 ...
- Centos7源代码安装freeswitch和启动freeswitch
centos7下安装freeswitch版本:1.6. 1.下载源代码: 进入目录 cd /usr/local/src 克隆原代码 git clone -b v1.6 https://freeswit ...
- 【android开发】如何在Linux平台下安装JDK环境
原文:http://android.eoe.cn/topic/android_sdk Linux平台JDK安装 本文主要描述如何在Linux平台下安装JDK环境.进入网页:http://www.ora ...
- Android:相机适配及图片处理的一些问题
链接:http://www.cnblogs.com/liushilin/p/6387263.html 链接:http://www.cnblogs.com/liushilin/p/5956691.htm ...
- 通过反射实现圆角ImageView
private void init(){ paint = new Paint(Paint.ANTI_ALIAS_FLAG); roundRect = , , getWidth() , getHeigh ...
- jira 跟工时有关的配置文件
./atlassian-jira/WEB-INF/classes/jpm.xml 关建字:jira.timetracking.hours.per.day <property> <ke ...
- 菜鸟学Java(十五)——Java反射机制(二)
上一篇博文<菜鸟学编程(九)——Java反射机制(一)>里面,向大家介绍了什么是Java的反射机制,以及Java的反射机制有什么用.上一篇比较偏重理论,理论的东西给人讲出来总感觉虚无缥缈, ...