当前位置: 代码迷 >> Sql Server >> 一个分页的存储过程,求优化!解决办法
  详细解决方案

一个分页的存储过程,求优化!解决办法

热度:81   发布时间:2016-04-27 19:17:27.0
一个分页的存储过程,求优化!
代码如下,为了支持排序查询,使用了临时表,但是在本机上测试,每页的查询时间需要1s,要是在网络上估计更慢,求高手优化。
SQL code
alter PROCEDURE PrcPager-- 获得某一页的数据 -- @currPage int = 1,                        --当前页页码 (即Top currPage) @showColumn nvarchar(2000) = '*',          --需要得到的字段 (即 column1,column2,......)@tempTableColumn nvarchar(2000), @tabName nvarchar(2000),                   --需要查看的表名 (即 from table_name) @strWhere nvarchar(2000) = '',             --查询条件 (即 where condition......) 不用加where关键字 @ascColumn nvarchar(1000) = '',            --排序的字段名 (即 order by column asc/desc) @bitOrderType bit = 0,  --排序的类型 (0为升序,1为降序) @pkColumn varchar(50) = '',  --主键名称 @pageSize int = 20,   --分页大小 @PageCount  int OUTPUT, --总页数@SumCount int output    --记录总数AS BEGIN -- 存储过程开始 -- 该存储过程需要用到的几个变量 DECLARE @strSql nvarchar(4000)           --该存储过程最后执行的语句 declare @MaxOrMin nvarchar(100)          --取最大值或最小值的判断DECLARE @strOrderType nvarchar(1000)     --排序类型语句 (order by column asc或者order by column desc) declare @sqlTemp nvarchar(1000)          --临时使用的sql语句--计算总记录数  计算一次 页面传回值的时候就不用计算了if @SumCount=0begin    if @strWhere != ''     begin       SET @sqlTemp=N'SELECT @SumCount=COUNT(*)'            +N' FROM [email protected]            +N' where  [email protected]    end     else    begin        SET @sqlTemp=N'SELECT @SumCount=COUNT(*)'            +N' FROM [email protected]    end    EXEC sp_executesql @sqlTemp,[email protected] int OUTPUT',@SumCount OUTPUT  end    SET @PageCount=(@[email protected])[email protected][email protected]----  -- bitOrderType=1即执行降序BEGIN IF @bitOrderType = 1   BEGIN     SET @strOrderType = ' ORDER BY [email protected]+' DESC'     set @MaxOrMin =' <(select min'END ELSE BEGIN     SET @strOrderType = ' ORDER BY [email protected]+' ASC'     set @MaxOrMin =' >(select max'END -----------------------------------------------------------------if(@strWhere!='')    set @strWhere=' where [email protected]if @currPage=0set @currPage=1IF @currPage = 1    -- 如果是第一页BEGIN        SET @strSql = 'SELECT TOP '+STR(@pageSize)+' [email protected]+' FROM [email protected]+' [email protected]+' [email protected] END ELSE  -- 其他页 前一半的记录if @currPage<@PageCount/2 BEGIN set @strSql=N'if object_id(''tempdb..#sel'')is not null  drop table #sel'--exec sp_executeSql @strSqlset  @[email protected]+'select identity(int,1,1) as id,* into #sel from (select TOP 100 PERCENT [email protected]+'from [email protected][email protected] +  @strOrderType+') as newtab'-- exec sp_executeSql @strSql --创建临时表--拼接查询结果代码 SET @strSql [email protected]+'select top '+str(@pageSize)+' [email protected]+'  from #sel where [email protected]+'(id) as id from (select top '+str((@currPage-1)[email protected])+' id  from #sel ) as T )'END END EXEC sp_executesql @strSqlEND  -- 存储过程结束


------解决方案--------------------
2005以上建议用ROW_NUMBER。
------解决方案--------------------
[email protected],那只能拼sql了(无法重用执行计划,每次sql会重新编译,会消耗些许时间),同时注意sql注入的风险
#2.分页取数据用sql server的新增函数row_number()效率会好很多,具体使用自己查
#3.一般的分页我们需要返回给Client端2个参数:一个是TotalCount,一个是某页的结果集.如果你使用的是row_number()函数,并且你的表有主键的话,参考下面这个资源:
http://blog.csdn.net/wwwwgou/article/details/6682324
  相关解决方案