SQL SERVER 大数据量分页存储过程效率测试附测试代码与结果
2022-11-12 09:54:22
内容摘要
这篇文章主要为大家详细介绍了SQL SERVER 大数据量分页存储过程效率测试附测试代码与结果,具有一定的参考价值,可以用来参考一下。
对此感兴趣的朋友,看看idc笔记做的技术笔记
文章正文
这篇文章主要为大家详细介绍了SQL SERVER 大数据量分页存储过程效率测试附测试代码与结果,具有一定的参考价值,可以用来参考一下。
对此感兴趣的朋友,看看idc笔记做的技术笔记!
测试环境硬件:CPU 酷睿双核T5750 内存:2G软件:Windows server 2003 + sql server 2005OK,我们首先创建一数据库:data_Test,并在此数据库中创建一表:tb_TestTable代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 | <code> create database data_Test --创建数据库 data_Test 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) GO </code> |
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 | <code> --插入数据 set identity_insert tb_TestTable on declare @ count int set @ count =1 while @ count <=2000000 begin insert into tb_TestTable(id,userName,userPWD,userEmail) values(@ count , 'admin' , 'admin888' , 'lli0077@yahoo.com.cn' ) set @ count =@ count +1 end set identity_insert tb_TestTable off </code> |
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <code>create procedure proc_paged_with_notin --利用select top and select not in ( @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(@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; end </code> |
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <code>create procedure proc_paged_with_selectMax --利用select top and select max(列) ( @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>(select max(id) From (select top ' +str(@pageSize*@pageIndex)+ ' id From tb_TestTable order by ID) as TempTable)) order by ID' execute(@sql) select datediff(ms,@timediff, GetDate ()) as 耗时 set nocount off; end </code> |
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <code>create procedure proc_paged_with_Midvar --利用ID>最大ID值和中间变量 ( @pageIndex int, @pageSize int ) as declare @ count int declare @ID int declare @timediff datetime declare @sql nvarchar(500) begin set nocount on; select @ count =0,@ID=0,@timediff= getdate () select @ count =@ count +1,@ID= case when @ count <=@pageSize*@pageIndex then ID else @ID end from tb_testTable order by id set @sql= 'select top ' +str(@pageSize)+ ' * from tb_testTable where ID>' +str(@ID) execute(@sql) select datediff(ms,@timediff, getdate ()) as 耗时 set nocount off; end </code> |
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <code>create procedure proc_paged_with_Rownumber --利用SQL 2005中的Row_number() ( @pageIndex int, @pageSize int ) as declare @timediff datetime begin set 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 耗时 set nocount off; end </code> |
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <code>create procedure proc_CTE --利用临时表及Row_number ( @pageIndex int, --页索引 @pageSize int --页记录数 ) as set nocount on; declare @ctestr nvarchar(400) declare @strSql nvarchar(400) declare @datediff datetime begin select @datediff= GetDate () set @ctestr='with Table_CTE as (select ceiling((Row_number() over(order by ID ASC))/ '+str(@pageSize)+' ) as page_num,* from tb_TestTable)'; set @strSql=@ctestr+ ' select * From Table_CTE where page_num=' +str(@pageIndex) end begin execute sp_executesql @strSql select datediff(ms,@datediff, GetDate ()) set nocount off; end </code> |
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 | <code> -- /*-----存储过程 分页处理 孙伟 2005-03-28创建 -------*/ -- /*-----存储过程 分页处理 浪尘 2008-9-1修改----------*/ -- /*----- 对数据进行了2分处理使查询前半部分数据与查询后半部分数据性能相同 -------*/ alter PROCEDURE proc_paged_2part_selectMax ( @tblName nvarchar(200), ----要显示的表或多个表的连接 @fldName nvarchar(500) = '*' , ----要显示的字段列表 @pageSize int = 10, ----每页显示的记录个数 @page int = 1, ----要显示那一页的记录 @fldSort nvarchar(200) = null, ----排序字段列表或条件 @Sort bit = 0, ----排序方法,0为升序,1为降序(如果是多字段排列Sort指代最后一个排序字段的排列顺序(最后一个排序字段不加排序标记)--程序传参如: ' SortA Asc,SortB Desc,SortC ' ) @strCondition nvarchar(1000) = null, ----查询条件,不需where @ID nvarchar(150), ----主表的主键 @Dist bit = 0, ----是否添加查询字段的 DISTINCT 默认0不添加/1添加 @pageCount int = 1 output, ----查询结果分页后的总页数 @Counts int = 1 output ----查询到的记录数 ) AS SET NOCOUNT ON Declare @sqlTmp nvarchar(1000) ----存放动态生成的SQL语句 Declare @strTmp nvarchar(1000) ----存放取得查询结果总数的查询语句 Declare @strID nvarchar(1000) ----存放取得查询开头或结尾ID的查询语句 Declare @strSortType nvarchar(10) ----数据排序规则A Declare @strFSortType nvarchar(10) ----数据排序规则B Declare @SqlSelect nvarchar(50) ----对含有DISTINCT的查询进行SQL构造 Declare @SqlCounts nvarchar(50) ----对含有DISTINCT的总数查询进行SQL构造 declare @timediff datetime --耗时测试时间差 select @timediff= getdate () if @Dist = 0 begin set @SqlSelect = 'select ' set @SqlCounts = 'Count(*)' end else begin set @SqlSelect = 'select distinct ' set @SqlCounts = 'Count(DISTINCT ' +@ID+ ')' end if @Sort=0 begin set @strFSortType= ' ASC ' set @strSortType= ' DESC ' end else begin set @strFSortType= ' DESC ' set @strSortType= ' ASC ' end --------生成查询语句-------- --此处@strTmp为取得查询结果数量的语句 if @strCondition is null or @strCondition= '' --没有设置显示条件 begin set @sqlTmp = @fldName + ' From ' + @tblName set @strTmp = @SqlSelect+ ' @Counts=' +@SqlCounts+ ' FROM ' +@tblName set @strID = ' From ' + @tblName end else begin set @sqlTmp = + @fldName + 'From ' + @tblName + ' where (1>0) ' + @strCondition set @strTmp = @SqlSelect+ ' @Counts=' +@SqlCounts+ ' FROM ' +@tblName + ' where (1>0) ' + @strCondition set @strID = ' From ' + @tblName + ' where (1>0) ' + @strCondition end ----取得查询结果总数量----- exec sp_executesql @strTmp,N '@Counts int out ' ,@Counts out declare @tmpCounts int if @Counts = 0 set @tmpCounts = 1 else set @tmpCounts = @Counts --取得分页总数 set @pageCount=(@tmpCounts+@pageSize-1)/@pageSize /**/ /**/ /**/ /**当前页大于总页数 取最后一页**/ if @page>@pageCount set @page=@pageCount -- /*-----数据分页2分处理-------*/ declare @pageIndex int --总数/页大小 declare @lastcount int --总数%页大小 set @pageIndex = @tmpCounts/@pageSize set @lastcount = @tmpCounts%@pageSize if @lastcount > 0 set @pageIndex = @pageIndex + 1 else set @lastcount = @pagesize -- //***显示分页 if @strCondition is null or @strCondition= '' --没有设置显示条件 begin if @pageIndex<2 or @page<=@pageIndex / 2 + @pageIndex % 2 --前半部分数据处理 begin if @page=1 set @strTmp=@SqlSelect+ ' top ' + CAST(@pageSize as VARCHAR(4))+ ' ' + @fldName+ ' from ' +@tblName + ' order by ' + @fldSort + ' ' + @strFSortType else begin if @Sort=1 begin set @strTmp=@SqlSelect+ ' top ' + CAST(@pageSize as VARCHAR(4))+ ' ' + @fldName+ ' from ' +@tblName + ' where ' +@ID+ ' <(select min(' + @ID + ') from (' + @SqlSelect+ ' top ' + CAST(@pageSize*(@page-1) as Varchar(20)) + ' ' + @ID + ' from ' +@tblName + ' order by ' + @fldSort + ' ' + @strFSortType+ ') AS TBMinID)' + ' order by ' + @fldSort + ' ' + @strFSortType end else begin set @strTmp=@SqlSelect+ ' top ' + CAST(@pageSize as VARCHAR(4))+ ' ' + @fldName+ ' from ' +@tblName + ' where ' +@ID+ ' >(select max(' + @ID + ') from (' + @SqlSelect+ ' top ' + CAST(@pageSize*(@page-1) as Varchar(20)) + ' ' + @ID + ' from ' +@tblName + ' order by ' + @fldSort + ' ' + @strFSortType+ ') AS TBMinID)' + ' order by ' + @fldSort + ' ' + @strFSortType end end end else begin set @page = @pageIndex-@page+1 --后半部分数据处理 if @page <= 1 --最后一页数据显示 set @strTmp=@SqlSelect+ ' * from (' +@SqlSelect+ ' top ' + CAST(@lastcount as VARCHAR(4))+ ' ' + @fldName+ ' from ' +@tblName + ' order by ' + @fldSort + ' ' + @strSortType+ ') AS TempTB' + ' order by ' + @fldSort + ' ' + @strFSortType else if @Sort=1 begin set @strTmp=@SqlSelect+ ' * from (' +@SqlSelect+ ' top ' + CAST(@pageSize as VARCHAR(4))+ ' ' + @fldName+ ' from ' +@tblName + ' where ' +@ID+ ' >(select max(' + @ID + ') from(' + @SqlSelect+ ' top ' + CAST(@pageSize*(@page-2)+@lastcount as Varchar(20)) + ' ' + @ID + ' from ' +@tblName + ' order by ' + @fldSort + ' ' + @strSortType+ ') AS TBMaxID)' + ' order by ' + @fldSort + ' ' + @strSortType+ ') AS TempTB' + ' order by ' + @fldSort + ' ' + @strFSortType end else begin set @strTmp=@SqlSelect+ ' * from (' +@SqlSelect+ ' top ' + CAST(@pageSize as VARCHAR(4))+ ' ' + @fldName+ ' from ' +@tblName + ' where ' +@ID+ ' <(select min(' + @ID + ') from(' + @SqlSelect+ ' top ' + CAST(@pageSize*(@page-2)+@lastcount as Varchar(20)) + ' ' + @ID + ' from ' +@tblName + ' order by ' + @fldSort + ' ' + @strSortType+ ') AS TBMaxID)' + ' order by ' + @fldSort + ' ' + @strSortType+ ') AS TempTB' + ' order by ' + @fldSort + ' ' + @strFSortType end end end else --有查询条件 begin if @pageIndex<2 or @page<=@pageIndex / 2 + @pageIndex % 2 --前半部分数据处理 begin if @page=1 set @strTmp=@SqlSelect+ ' top ' + CAST(@pageSize as VARCHAR(4))+ ' ' + @fldName+ ' from ' +@tblName + ' where 1=1 ' + @strCondition + ' order by ' + @fldSort + ' ' + @strFSortType else if (@Sort=1) begin set @strTmp=@SqlSelect+ ' top ' + CAST(@pageSize as VARCHAR(4))+ ' ' + @fldName+ ' from ' +@tblName + ' where ' +@ID+ ' <(select min(' + @ID + ') from (' + @SqlSelect+ ' top ' + CAST(@pageSize*(@page-1) as Varchar(20)) + ' ' + @ID + ' from ' +@tblName + ' where (1=1) ' + @strCondition + ' order by ' + @fldSort + ' ' + @strFSortType+ ') AS TBMinID)' + ' ' + @strCondition + ' order by ' + @fldSort + ' ' + @strFSortType end else begin set @strTmp=@SqlSelect+ ' top ' + CAST(@pageSize as VARCHAR(4))+ ' ' + @fldName+ ' from ' +@tblName + ' where ' +@ID+ ' >(select max(' + @ID + ') from (' + @SqlSelect+ ' top ' + CAST(@pageSize*(@page-1) as Varchar(20)) + ' ' + @ID + ' from ' +@tblName + ' where (1=1) ' + @strCondition + ' order by ' + @fldSort + ' ' + @strFSortType+ ') AS TBMinID)' + ' ' + @strCondition + ' order by ' + @fldSort + ' ' + @strFSortType end end else begin set @page = @pageIndex-@page+1 --后半部分数据处理 if @page <= 1 --最后一页数据显示 set @strTmp=@SqlSelect+ ' * from (' +@SqlSelect+ ' top ' + CAST(@lastcount as VARCHAR(4))+ ' ' + @fldName+ ' from ' +@tblName + ' where (1=1) ' + @strCondition + ' order by ' + @fldSort + ' ' + @strSortType+ ') AS TempTB' + ' order by ' + @fldSort + ' ' + @strFSortType else if (@Sort=1) set @strTmp=@SqlSelect+ ' * from (' +@SqlSelect+ ' top ' + CAST(@pageSize as VARCHAR(4))+ ' ' + @fldName+ ' from ' +@tblName + ' where ' +@ID+ ' >(select max(' + @ID + ') from(' + @SqlSelect+ ' top ' + CAST(@pageSize*(@page-2)+@lastcount as Varchar(20)) + ' ' + @ID + ' from ' +@tblName + ' where (1=1) ' + @strCondition + ' order by ' + @fldSort + ' ' + @strSortType+ ') AS TBMaxID)' + ' ' + @strCondition+ ' order by ' + @fldSort + ' ' + @strSortType+ ') AS TempTB' + ' order by ' + @fldSort + ' ' + @strFSortType else set @strTmp=@SqlSelect+ ' * from (' +@SqlSelect+ ' top ' + CAST(@pageSize as VARCHAR(4))+ ' ' + @fldName+ ' from ' +@tblName + ' where ' +@ID+ ' <(select min(' + @ID + ') from(' + @SqlSelect+ ' top ' + CAST(@pageSize*(@page-2)+@lastcount as Varchar(20)) + ' ' + @ID + ' from ' +@tblName + ' where (1=1) ' + @strCondition + ' order by ' + @fldSort + ' ' + @strSortType+ ') AS TBMaxID)' + ' ' + @strCondition+ ' order by ' + @fldSort + ' ' + @strSortType+ ') AS TempTB' + ' order by ' + @fldSort + ' ' + @strFSortType end end ------返回查询结果----- exec sp_executesql @strTmp select datediff(ms,@timediff, getdate ()) as 耗时 -- print @strTmp SET NOCOUNT OFF GO </code> |
注:关于SQL SERVER 大数据量分页存储过程效率测试附测试代码与结果的内容就先介绍到这里,更多相关文章的可以留意
代码注释