SQL大数据量分页存储过程效率测试

ContractedBlock.gif ExpandedBlockStart.gif 代码
 
   
1 -- /* -----存储过程 分页处理 孙伟 2005-03-28创建 ------- */
2 -- /* -----存储过程 分页处理 浪尘 2008-9-1修改---------- */
3 -- /* ----- 对数据进行了2分处理使查询前半部分数据与查询后半部分数据性能相同 ------- */
4
5alter PROCEDURE proc_paged_2part_selectMax
6 (
7 @tblName nvarchar( 200 ), ---- 要显示的表或多个表的连接
8 @fldName nvarchar( 500 ) = ' * ' , ---- 要显示的字段列表
9 @pageSize int = 10 , ---- 每页显示的记录个数
10 @page int = 1 , ---- 要显示那一页的记录
11 @fldSort nvarchar( 200 ) = null , ---- 排序字段列表或条件
12 @Sort bit = 0 , ---- 排序方法,0为升序,1为降序(如果是多字段排列Sort指代最后一个排序字段的排列顺序(最后一个排序字段不加排序标记) -- 程序传参如: ' SortA Asc,SortB Desc,SortC ' )
13 @strCondition nvarchar( 1000 ) = null , ---- 查询条件,不需where
14 @ID nvarchar( 150 ), ---- 主表的主键
15 @Dist bit = 0 , ---- 是否添加查询字段的 DISTINCT 默认0不添加 / 1添加
16 @pageCount int = 1 output, ---- 查询结果分页后的总页数
17 @Counts int = 1 output ---- 查询到的记录数
18 )
19AS
20SET NOCOUNT ON
21Declare @sqlTmp nvarchar(
1000 ) ---- 存放动态生成的SQL语句
22Declare @strTmp nvarchar(
1000 ) ---- 存放取得查询结果总数的查询语句
23Declare @strID nvarchar(
1000 ) ---- 存放取得查询开头或结尾ID的查询语句
24
25Declare @strSortType nvarchar(
10 ) ---- 数据排序规则A
26Declare @strFSortType nvarchar(
10 ) ---- 数据排序规则B
27
28Declare @SqlSelect nvarchar(
50 ) ---- 对含有DISTINCT的查询进行SQL构造
29Declare @SqlCounts nvarchar(
50 ) ---- 对含有DISTINCT的总数查询进行SQL构造
30
31declare @timediff datetime
-- 耗时测试时间差
32select @timediff
= getdate()
33
34
if @Dist = 0
35begin
36 set @SqlSelect = ' select '
37 set @SqlCounts = ' Count(*) '
38end
39
else
40begin
41 set @SqlSelect = ' select distinct '
42 set @SqlCounts = ' Count(DISTINCT ' + @ID + ' ) '
43end
44
45
46
if @Sort = 0
47begin
48 set @strFSortType = ' ASC '
49 set @strSortType = ' DESC '
50end
51
else
52begin
53 set @strFSortType = ' DESC '
54 set @strSortType = ' ASC '
55end
56
57
58
59 -------- 生成查询语句 --------
60 -- 此处@strTmp为取得查询结果数量的语句
61
if @strCondition is null or @strCondition = '' -- 没有设置显示条件
62begin
63 set @sqlTmp = @fldName + ' From ' + @tblName
64 set @strTmp = @SqlSelect + ' @Counts= ' + @SqlCounts + ' FROM ' + @tblName
65 set @strID = ' From ' + @tblName
66end
67
else
68begin
69 set @sqlTmp = + @fldName + ' From ' + @tblName + ' where (1>0) ' + @strCondition
70 set @strTmp = @SqlSelect + ' @Counts= ' + @SqlCounts + ' FROM ' + @tblName + ' where (1>0) ' + @strCondition
71 set @strID = ' From ' + @tblName + ' where (1>0) ' + @strCondition
72end
73
74 ---- 取得查询结果总数量 -----
75exec sp_executesql @strTmp,N
' @Counts int out ' ,@Counts out
76declare @tmpCounts
int
77
if @Counts = 0
78 set @tmpCounts = 1
79
else
80 set @tmpCounts = @Counts
81
82 -- 取得分页总数
83 set @pageCount = (@tmpCounts + @pageSize - 1 ) / @pageSize
84
85 /**//**//**//* *当前页大于总页数 取最后一页* */
86 if @page > @pageCount
87 set @page = @pageCount
88
89 -- /* -----数据分页2分处理------- */
90 declare @pageIndex int -- 总数 / 页大小
91 declare @lastcount int -- 总数 % 页大小
92
93 set @pageIndex = @tmpCounts / @pageSize
94 set @lastcount = @tmpCounts % @pageSize
95 if @lastcount > 0
96 set @pageIndex = @pageIndex + 1
97 else
98 set @lastcount = @pagesize
99
100 -- // ***显示分页
101 if @strCondition is null or @strCondition = '' -- 没有设置显示条件
102 begin
103 if @pageIndex < 2 or @page <= @pageIndex / 2 + @pageIndex % 2 -- 前半部分数据处理
104 begin
105 if @page = 1
106 set @strTmp = @SqlSelect + ' top ' + CAST(@pageSize as VARCHAR( 4 )) + ' ' + @fldName + ' from ' + @tblName
107 + ' order by ' + @fldSort + ' ' + @strFSortType
108 else
109 begin
110 if @Sort = 1
111 begin
112 set @strTmp = @SqlSelect + ' top ' + CAST(@pageSize as VARCHAR( 4 )) + ' ' + @fldName + ' from ' + @tblName
113 + ' where ' + @ID + ' <(select min( ' + @ID + ' ) from ( ' + @SqlSelect + ' top ' + CAST(@pageSize * (@page - 1 ) as Varchar( 20 )) + ' ' + @ID + ' from ' + @tblName
114 + ' order by ' + @fldSort + ' ' + @strFSortType + ' ) AS TBMinID) '
115 + ' order by ' + @fldSort + ' ' + @strFSortType
116 end
117 else
118 begin
119 set @strTmp = @SqlSelect + ' top ' + CAST(@pageSize as VARCHAR( 4 )) + ' ' + @fldName + ' from ' + @tblName
120 + ' where ' + @ID + ' >(select max( ' + @ID + ' ) from ( ' + @SqlSelect + ' top ' + CAST(@pageSize * (@page - 1 ) as Varchar( 20 )) + ' ' + @ID + ' from ' + @tblName
121 + ' order by ' + @fldSort + ' ' + @strFSortType + ' ) AS TBMinID) '
122 + ' order by ' + @fldSort + ' ' + @strFSortType
123 end
124 end
125 end
126 else
127 begin
128 set @page = @pageIndex - @page + 1 -- 后半部分数据处理
129 if @page <= 1 -- 最后一页数据显示
130 set @strTmp = @SqlSelect + ' * from ( ' + @SqlSelect + ' top ' + CAST(@lastcount as VARCHAR( 4 )) + ' ' + @fldName + ' from ' + @tblName
131 + ' order by ' + @fldSort + ' ' + @strSortType + ' ) AS TempTB ' + ' order by ' + @fldSort + ' ' + @strFSortType
132 else
133 if @Sort = 1
134 begin
135 set @strTmp = @SqlSelect + ' * from ( ' + @SqlSelect + ' top ' + CAST(@pageSize as VARCHAR( 4 )) + ' ' + @fldName + ' from ' + @tblName
136 + ' where ' + @ID + ' >(select max( ' + @ID + ' ) from( ' + @SqlSelect + ' top ' + CAST(@pageSize * (@page - 2 ) + @lastcount as Varchar( 20 )) + ' ' + @ID + ' from ' + @tblName
137 + ' order by ' + @fldSort + ' ' + @strSortType + ' ) AS TBMaxID) '
138 + ' order by ' + @fldSort + ' ' + @strSortType + ' ) AS TempTB ' + ' order by ' + @fldSort + ' ' + @strFSortType
139 end
140 else
141 begin
142 set @strTmp = @SqlSelect + ' * from ( ' + @SqlSelect + ' top ' + CAST(@pageSize as VARCHAR( 4 )) + ' ' + @fldName + ' from ' + @tblName
143 + ' where ' + @ID + ' <(select min( ' + @ID + ' ) from( ' + @SqlSelect + ' top ' + CAST(@pageSize * (@page - 2 ) + @lastcount as Varchar( 20 )) + ' ' + @ID + ' from ' + @tblName
144 + ' order by ' + @fldSort + ' ' + @strSortType + ' ) AS TBMaxID) '
145 + ' order by ' + @fldSort + ' ' + @strSortType + ' ) AS TempTB ' + ' order by ' + @fldSort + ' ' + @strFSortType
146 end
147 end
148 end
149
150 else -- 有查询条件
151 begin
152 if @pageIndex < 2 or @page <= @pageIndex / 2 + @pageIndex % 2 -- 前半部分数据处理
153 begin
154 if @page = 1
155 set @strTmp = @SqlSelect + ' top ' + CAST(@pageSize as VARCHAR( 4 )) + ' ' + @fldName + ' from ' + @tblName
156 + ' where 1=1 ' + @strCondition + ' order by ' + @fldSort + ' ' + @strFSortType
157 else if (@Sort = 1 )
158 begin
159 set @strTmp = @SqlSelect + ' top ' + CAST(@pageSize as VARCHAR( 4 )) + ' ' + @fldName + ' from ' + @tblName
160 + ' where ' + @ID + ' <(select min( ' + @ID + ' ) from ( ' + @SqlSelect + ' top ' + CAST(@pageSize * (@page - 1 ) as Varchar( 20 )) + ' ' + @ID + ' from ' + @tblName
161 + ' where (1=1) ' + @strCondition + ' order by ' + @fldSort + ' ' + @strFSortType + ' ) AS TBMinID) '
162 + ' ' + @strCondition + ' order by ' + @fldSort + ' ' + @strFSortType
163 end
164 else
165 begin
166 set @strTmp = @SqlSelect + ' top ' + CAST(@pageSize as VARCHAR( 4 )) + ' ' + @fldName + ' from ' + @tblName
167 + ' where ' + @ID + ' >(select max( ' + @ID + ' ) from ( ' + @SqlSelect + ' top ' + CAST(@pageSize * (@page - 1 ) as Varchar( 20 )) + ' ' + @ID + ' from ' + @tblName
168 + ' where (1=1) ' + @strCondition + ' order by ' + @fldSort + ' ' + @strFSortType + ' ) AS TBMinID) '
169 + ' ' + @strCondition + ' order by ' + @fldSort + ' ' + @strFSortType
170 end
171 end
172 else
173 begin
174 set @page = @pageIndex - @page + 1 -- 后半部分数据处理
175 if @page <= 1 -- 最后一页数据显示
176 set @strTmp = @SqlSelect + ' * from ( ' + @SqlSelect + ' top ' + CAST(@lastcount as VARCHAR( 4 )) + ' ' + @fldName + ' from ' + @tblName
177 + ' where (1=1) ' + @strCondition + ' order by ' + @fldSort + ' ' + @strSortType + ' ) AS TempTB ' + ' order by ' + @fldSort + ' ' + @strFSortType
178 else if (@Sort = 1 )
179 set @strTmp = @SqlSelect + ' * from ( ' + @SqlSelect + ' top ' + CAST(@pageSize as VARCHAR( 4 )) + ' ' + @fldName + ' from ' + @tblName
180 + ' where ' + @ID + ' >(select max( ' + @ID + ' ) from( ' + @SqlSelect + ' top ' + CAST(@pageSize * (@page - 2 ) + @lastcount as Varchar( 20 )) + ' ' + @ID + ' from ' + @tblName
181 + ' where (1=1) ' + @strCondition + ' order by ' + @fldSort + ' ' + @strSortType + ' ) AS TBMaxID) '
182 + ' ' + @strCondition + ' order by ' + @fldSort + ' ' + @strSortType + ' ) AS TempTB ' + ' order by ' + @fldSort + ' ' + @strFSortType
183 else
184 set @strTmp = @SqlSelect + ' * from ( ' + @SqlSelect + ' top ' + CAST(@pageSize as VARCHAR( 4 )) + ' ' + @fldName + ' from ' + @tblName
185 + ' where ' + @ID + ' <(select min( ' + @ID + ' ) from( ' + @SqlSelect + ' top ' + CAST(@pageSize * (@page - 2 ) + @lastcount as Varchar( 20 )) + ' ' + @ID + ' from ' + @tblName
186 + ' where (1=1) ' + @strCondition + ' order by ' + @fldSort + ' ' + @strSortType + ' ) AS TBMaxID) '
187 + ' ' + @strCondition + ' order by ' + @fldSort + ' ' + @strSortType + ' ) AS TempTB ' + ' order by ' + @fldSort + ' ' + @strFSortType
188 end
189 end
190
191 ------ 返回查询结果 -----
192exec sp_executesql @strTmp
193select datediff(ms,@timediff,getdate())
as 耗时
194 -- print @strTmp
195SET NOCOUNT OFF
196GO
197


执行示例:exec proc_paged_2part_selectMax
' tb_testTable ' , ' ID,userName,userPWD,userEmail ' , 10 , 100000 , ' ID ' , 0 , null , ' ID ' , 0

 http://www.cnblogs.com/qintm/articles/1284285.html

转载于:https://www.cnblogs.com/xiaofengfeng/archive/2010/08/24/1807584.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值