普通方式 分页【NOT IN】和【>】效率大PK 千万级别数据测试结果
首现创建一张表,然后插入1000+万条数据,接下来进行测试。
use TT
go if exists (select * from sysobjects where name='Tonge') drop table Tonge create table Tonge( ID int primary key identity(1,1), NAME varchar(100), PWD varchar(100), PHONE varchar(100), BORNDATE date default getDate() ) go --存储过程插入10万条数据耗时:38s//平均 2600条/s declare @i int set @i=0 while(@i<=100000) --插入测试数据10万条 begin insert into Tonge values('Tonge'+Convert(varchar(2),@i),'Tonge594200'+Convert(varchar(2),@i),'16886888688',default) set @i = @i+1 end go --疯狂插入法插万条插入640万条数据耗时:101s //平均 63000条/s insert into Tonge(NAME,PWD,PHONE,BORNDATE)( select NAME,PWD,PHONE,BORNDATE from Tonge ) --疯狂插入法7次 10*2*2*2*2*2*2*2=1284万条数据 go select MAX(ID) FROM Tonge
--DBCC SHRINKFILE(TTDB_log,0) --清除事务日志
--使用 Not In 分页
declare @PageSize int,@PageIndex int,@TotalPage int select @PageSize=1000,@PageIndex=1000 print '当前页数'+convert(varchar(5),@PageIndex)+' 总页数:' + Convert(varchar(5),@TotalPage) --等待6分钟未果、也就是3600s、CPU暴增... select top(@PageSize) * from Tonge where ID not in(select top(@PageSize*(@PageIndex-1)) ID from Tonge) order by ID --大于号分页测试
declare @PageSize int,@PageIndex int,@TotalPage int select @PageSize=1000,@PageIndex=1000 --每页显示1万条数据,显示第10页 --exec usp_Sign_PagedTonge @PageSize,@PageIndex,@TotalPage output print '当前页数'+convert(varchar(5),@PageIndex)+' 总页数:' + Convert(varchar(5),@TotalPage) --瞬间秒杀
select top(@PageSize) * from Tonge where id > (select max(id) from (select top (@PageSize*(@PageIndex-1)) id from Tonge order by id) emp) 测试结果:测试结果已经很明显了,那就是在普通分页中,对千万级别的数据进行分页(相同页码相同数据),大于号( > ) 甩Not In 几条街,另一篇我会介绍使用 存储过程分页 not in 和 > 号的区别 。 |