首页 > 代码库 > sql 分页
sql 分页
在项目中,我们经常遇到或用到分页,那么在大数据量(百万级以上)下,哪种分页算法效率最优呢?我们不妨用事实说话。
测试环境
硬件:CPU 酷睿双核T5750 内存:2G
软件:Windows server 2003 + Sql server 2005
OK,我们首先创建一数据库:data_Test,并在此数据库中创建一表:tb_TestTable
1create database data_Test --创建数据库data_Test 2GO 3use data_Test 4GO 5create table tb_TestTable --创建表 6( id int identity(1,1) primary key, userName nvarchar(20) not null, userPWD nvarchar(20) not null, userEmail nvarchar(40) null 11) 12GO
1--插入数据 2set identity_insert tb_TestTable on 3declare @count int 4set @count=1 5while @count<=2000000 6begin insert into tb_TestTable(id,userName,userPWD,userEmail) values(@count,‘admin‘,‘admin888‘,‘lli0077@yahoo.com.cn‘) set @count=@count+1 9end 10set identity_insert tb_TestTable off
利用select top 和select not in进行分页,具体代码如下:
1create procedure proc_paged_with_notin --利用select top and select not in 2( @pageIndex int, --页索引 @pageSize int --每页记录数 5) 6as 7begin set 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后不支技直接接参数,所以写成了字符串@sql select datediff(ms,@timediff,GetDate()) as 耗时 set nocount off; 16end
利用select top 和 select max(列键)
create procedure proc_paged_with_selectMax --利用select top and select max(列) 2( 3 @pageIndex int, --页索引 4 @pageSize int --页记录数 5) 6as 7begin 8set nocount on; 9 declare @timediff datetime 10 declare @sql nvarchar(500) 11 select @timediff=Getdate() 12 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‘ 13 execute(@sql) 14 select datediff(ms,@timediff,GetDate()) as 耗时 15set nocount off; 16end
利用Row_number() 此方法为SQL server 2005中新的方法,利用Row_number()给数据行加上索引
1create procedure proc_paged_with_Rownumber --利用SQL 2005中的Row_number() 2( @pageIndex int, @pageSize int 5) 6as declare @timediff datetime 8begin 9set nocount on; select @timediff=getdate() select * from (select *,Row_number() over(order by ID asc) as IDRank from tb_testTable) as IDWithRowNumber where IDRank>@pageSize*@pageIndex and IDRank<@pageSize*(@pageIndex+1) select datediff(ms,@timediff,getdate()) as 耗时 13set nocount off; 14end 15
sql 分页
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。