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

Posted

篇首语:互补的人容易一见钟情,相似的人适合一起变老。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 SQL大数据量分页存储过程效率测试相关的知识,希望对你有一定的参考价值。

SQL大数据量分页存储过程效率测试  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

   /* 存储过程 分页处理 孙伟 创建 */

   /* 存储过程 分页处理 浪尘 修改 */

   /* 对数据进行了 分处理使查询前半部分数据与查询后半部分数据性能相同 */

  

   alter PROCEDURE proc_paged_ part_selectMax

   (

   @tblName     nvarchar( )         要显示的表或多个表的连接

   @fldName     nvarchar( ) = *     要显示的字段列表

   @pageSize    int =         每页显示的记录个数

   @page        int =         要显示那一页的记录

   @fldSort    nvarchar( ) = null     排序字段列表或条件

   @Sort        bit =         排序方法 为升序 为降序(如果是多字段排列Sort指代最后一个排序字段的排列顺序(最后一个排序字段不加排序标记) 程序传参如 SortA Asc SortB Desc SortC )

   @strCondition    nvarchar( ) = null     查询条件 不需where

   @ID        nvarchar( )         主表的主键

   @Dist                 bit =            是否添加查询字段的 DISTINCT 默认 不添加/ 添加

   @pageCount    int = output             查询结果分页后的总页数

   @Counts    int = output                查询到的记录数

   )

   AS

   SET NOCOUNT ON

   Declare @sqlTmp nvarchar( )        存放动态生成的SQL语句

   Declare @strTmp nvarchar( )        存放取得查询结果总数的查询语句

   Declare @strID     nvarchar( )        存放取得查询开头或结尾ID的查询语句

  

   Declare @strSortType nvarchar( )    数据排序规则A

   Declare @strFSortType nvarchar( )    数据排序规则B

  

   Declare @SqlSelect nvarchar( )         对含有DISTINCT的查询进行SQL构造

   Declare @SqlCounts nvarchar( )          对含有DISTINCT的总数查询进行SQL构造

  

   declare @timediff datetime  耗时测试时间差

   select @timediff=getdate()

  

   if @Dist  =

   begin

       set @SqlSelect = select

       set @SqlCounts = Count(*)

   end

   else

   begin

       set @SqlSelect = select distinct

       set @SqlCounts = Count(DISTINCT +@ID+ )

   end

  

  

   if @Sort=

   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 ( > ) + @strCondition

       set @strTmp = @SqlSelect+ @Counts= +@SqlCounts+ FROM +@tblName + where ( > ) + @strCondition

       set @strID = From + @tblName + where ( > ) + @strCondition

   end

  

   取得查询结果总数量

   exec sp_executesql @strTmp N @Counts int out @Counts out

   declare @tmpCounts int

   if @Counts =

       set @tmpCounts =

   else

       set @tmpCounts = @Counts

  

       取得分页总数

       set @pageCount=(@tmpCounts+@pageSize )/@pageSize

  

       /**//**//**//**当前页大于总页数 取最后一页**/

       if @page>@pageCount

           set @page=@pageCount

  

       /* 数据分页 分处理 */

       declare @pageIndex int 总数/页大小

       declare @lastcount int 总数%页大小

  

       set @pageIndex = @tmpCounts/@pageSize

       set @lastcount = @tmpCounts%@pageSize

       if @lastcount >

           set @pageIndex = @pageIndex +

       else

           set @lastcount = @pagesize

  

       //***显示分页

       if @strCondition is null or @strCondition=      没有设置显示条件

       begin

           if @pageIndex< or @page<=@pageIndex / + @pageIndex %    前半部分数据处理

               begin

                   if @page=

                       set @strTmp=@SqlSelect+ top + CAST(@pageSize as VARCHAR( ))+ + @fldName+ from +@tblName

                           + order by + @fldSort + + @strFSortType

                   else

                   begin

                       if @Sort=

                       begin

                       set @strTmp=@SqlSelect+ top + CAST(@pageSize as VARCHAR( ))+ + @fldName+ from +@tblName

                           + where +@ID+ <(select min( + @ID + ) from ( + @SqlSelect+ top + CAST(@pageSize*(@page ) as Varchar( )) + + @ID + from +@tblName

                           + order by + @fldSort + + @strFSortType+ ) AS TBMinID)

                           + order by + @fldSort + + @strFSortType

                       end

                       else

                       begin

                       set @strTmp=@SqlSelect+ top + CAST(@pageSize as VARCHAR( ))+ + @fldName+ from +@tblName

                           + where +@ID+ >(select max( + @ID + ) from ( + @SqlSelect+ top + CAST(@pageSize*(@page ) as Varchar( )) + + @ID + from +@tblName

                           + order by + @fldSort + + @strFSortType+ ) AS TBMinID)

                           + order by + @fldSort + + @strFSortType

                       end

                   end

               end

           else

               begin

               set @page = @pageIndex @page+ 后半部分数据处理

                   if @page <= 最后一页数据显示

                       set @strTmp=@SqlSelect+ * from ( +@SqlSelect+ top + CAST(@lastcount as VARCHAR( ))+ + @fldName+ from +@tblName

                           + order by + @fldSort + + @strSortType+ ) AS TempTB + order by + @fldSort + + @strFSortType

                   else

                       if @Sort=

                       begin

                       set @strTmp=@SqlSelect+ * from ( +@SqlSelect+ top + CAST(@pageSize as VARCHAR( ))+ + @fldName+ from +@tblName

                           + where +@ID+ >(select max( + @ID + ) from( + @SqlSelect+ top + CAST(@pageSize*(@page )+@lastcount as Varchar( )) + + @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( ))+ + @fldName+ from +@tblName

                           + where +@ID+ <(select min( + @ID + ) from( + @SqlSelect+ top + CAST(@pageSize*(@page )+@lastcount as Varchar( )) + + @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< or @page<=@pageIndex / + @pageIndex %    前半部分数据处理

           begin

                   if @page=

                       set @strTmp=@SqlSelect+ top + CAST(@pageSize as VARCHAR( ))+ + @fldName+ from +@tblName

                           + where = + @strCondition + order by + @fldSort + + @strFSortType

                   else if(@Sort= )

                   begin

                       set @strTmp=@SqlSelect+ top + CAST(@pageSize as VARCHAR( ))+ + @fldName+ from +@tblName

                           + where +@ID+ <(select min( + @ID + ) from ( + @SqlSelect+ top + CAST(@pageSize*(@page ) as Varchar( )) + + @ID + from +@tblName

                           + where ( = ) + @strCondition + order by + @fldSort + + @strFSortType+ ) AS TBMinID)

                           + + @strCondition + order by + @fldSort + + @strFSortType

                   end

                   else

                   begin

                       set @strTmp=@SqlSelect+ top + CAST(@pageSize as VARCHAR( ))+ + @fldName+ from +@tblName

                           + where +@ID+ >(select max( + @ID + ) from ( + @SqlSelect+ top + CAST(@pageSize*(@page ) as Varchar( )) + + @ID + from +@tblName

                           + where ( = ) + @strCondition + order by + @fldSort + + @strFSortType+ ) AS TBMinID)

                           + + @strCondition + order by + @fldSort + + @strFSortType

                   end

           end

           else

           begin

               set @page = @pageIndex @page+ 后半部分数据处理

               if @page <= 最后一页数据显示

                       set @strTmp=@SqlSelect+ * from ( +@SqlSelect+ top + CAST(@lastcount as VARCHAR( ))+ + @fldName+ from +@tblName

                           + where ( = ) + @strCondition + order by + @fldSort + + @strSortType+ ) AS TempTB + order by + @fldSort + + @strFSortType

               else if(@Sort= )

                       set @strTmp=@SqlSelect+ * from ( +@SqlSelect+ top + CAST(@pageSize as VARCHAR( ))+ + @fldName+ from +@tblName

                           + where +@ID+ >(select max( + @ID + ) from( + @SqlSelect+ top + CAST(@pageSize*(@page )+@lastcount as Varchar( )) + + @ID + from +@tblName

                           + where ( = ) + @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( ))+ + @fldName+ from +@tblName

                           + where +@ID+ <(select min( + @ID + ) from( + @SqlSelect+ top + CAST(@pageSize*(@page )+@lastcount as Varchar( )) + + @ID + from +@tblName

                           + where ( = ) + @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

cha138/Article/program/net/201311/11443

相关参考

知识大全 sql存储过程分页

  CREATEPROCmyx_prPageRecordset   @queryStrnvarchar()   @keyFieldnvarc

知识大全 sql存储过程分页算法研究

  “俄罗斯存储过程”的改良版  CREATEprocedurepagination(@pagesizeint页面大小如每页存储条记录@pageindexint当前页码)assetnocountonb

知识大全 SQL Server 千万数量级 分页 存储过程

SQLServer千万数量级分页存储过程  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  随着信息

知识大全 oracle多条件查询分页存储过程

  项目接近尾声了感觉将业务逻辑放到oracle中使得后台代码很精简oracle很有搞头!  PL\\SQL:  createorreplaceprocedureproc_client_List客户多

知识大全 一个简单的oracle分页存储过程的实现和调用

  在看了众多的分页存储过程以后发现都是针对sqlserver的而没有oracle的因此想写一个关于oracle的存储过程因为我用到的数据库是oracleoracle分页存储过程的思路于sqlserv

知识大全 SQL存储过程在.NET数据库中的应用(2)

SQL存储过程在.NET数据库中的应用(2)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  五.

知识大全 SQL存储过程在.NET数据库中的应用(1)

SQL存储过程在.NET数据库中的应用(1)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  一.

知识大全 MSsql数据库如何实现分页存储的代码实例

MSsql数据库如何实现分页存储的代码实例  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!lishi

知识大全 oracle存储过程分页代码

  oracle存储过程分页代码是怎么实现的我们来看下实验小编为您整理的方法吧!  /*******存储过程分页代码**********/  包头  createorreplacepackagepck

知识大全 分页SQLServer存储过程

分页SQLServer存储过程  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  /*用存储过程实现