create database data_test on primary ( name='data_test_data', filename='C:data_test_data.mdf', size=5mb, maxsize=100mb, filegrowth=15% ) log on ( name='data_test_log', filename='C:data_test_log.ldf', size=2mb, filegrowth=1mb ) go use data_test go create table tb_testtable ( id int identity (1,1) primary key, username nvarchar(20) not null, userpwd nvarchar(20) not null, userEmail nvarchar(40) null ) set identity_insert tb_testtable on declare @count int set @count=1 while @count<=200000 begin insert into tb_testtable (id,username,userpwd,useremail) values(@count,'admin','admin888','lihfei89@163.com') set @count=@count+1 end set identity_insert tb_testtable off --利用select top and select not in 耗时1533s --select top 10 * from tb_testtable where (id not in(select top 15 id from tb_testtable order by id asc)) order by id create procedure proc_page_withnotin ( @pageIndex int,--页索引 @pageSize int--每页显示数 ) as begin 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((@pageIndex-1) * @pageSize) +' id from tb_testtable order by id)) order by id' execute(@sql) --因select top后不支技直接接参数,所以写成了字符串@sql select datediff(ms,@timediff,Getdate()) as wastetime set nocount off; end --利用select top and select max耗时33s --select top 10 * from tb_testtable where --(id > (select max(id) from (select top 10 id from tb_testtable order by id ) as temp )) --order by id create procedure proc_page_withtopmax ( @pageIndex int, @pageSize int ) as begin set nocount on; declare @timediff datetime declare @sql nvarchar(500) select @timediff=getDate() set @sql='select top 10 * from tb_testtable where (id> (select max(id) from (select top '+str((@pageIndex-1)*@pageSize)+' id from tb_testtable order by id) as temp)) order by id' execute(@sql) select datediff(ms,@timediff,getdate()) as wastetime set nocount off; end --利用Row_number()耗时1633s --select * from (select *,row_number() over(order by id) rn from tb_testtable) as temp where rn between 11 and 20 create procedure proc_pagewithrownumber ( @pageIndex int, @pageSize int ) as begin set nocount on; declare @timediff datetime declare @sql nvarchar(500) select @timediff=getdate() set @sql='select * from (select *,row_number() over (order by id) rn from tb_testtable) as temp where rn between '+str((@pageIndex-1)*@pageSize +1 )+' and ' +str(@pageIndex*@pageSize) execute(@sql) select datediff(ms,@timediff,getdate()) as wastetime set nocount off; end exec proc_page_withnotin 2,100000-- wastetime(1533) exec proc_page_withtopmax 2,100000--wastetime(33) exec proc_pagewithrownumber 2,100000--wastetime(1633)