zoukankan      html  css  js  c++  java
  • SQL大数据量分页存储过程效率测试

    代码
    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

  • 相关阅读:
    Linux守护进程的编程实现
    QUIC简单介绍
    oracle10G/11G官方下载地址集合 直接迅雷下载
    Linux 解决文件删除,但并没有改变磁盘可用性
    开始使用正则表达式
    Codeforces 442C Artem and Array(stack+贪婪)
    Drop dual
    ios结构体httpPost头结构
    一个人ACM(我们赶上了ACM)
    Linux svnserver存储路径和文件的详细解释
  • 原文地址:https://www.cnblogs.com/xiaofengfeng/p/1807584.html
Copyright © 2011-2022 走看看