表变量分页

  这个本人现在有个一个分页代码,在有多个字段排序的时候性能觉的还可以,比临时表快多了,希望有兴趣的朋友测试一下,如果有不同意见请大家拍砖,谢谢指点。
create proc [dbo].[sc_searchjianli]
@PageSize int,            --页大小
@intPage int,            --当前页数
@strwhere nvarchar(1000)    --查询条件
as
    
begin
        
set nocount on
        
declare @TotalCount int            --总数量
        declare @PageCount int            --总页数
        declare @LowerBound int --定义此页的底码
        declare @UpperBound int  --定义此页的顶码    
        declare @varSql nvarchar(3000)
        
--计算总个数
        set @varsql='select @TotalCount=count(1) 
                   from jianli a join personinfo b on a.loginid=b.loginid join jiaoyu c on a.loginid=c.loginid join yingpininfo d on a.loginid=d.loginid
                    where a.jlzt=0
'+  @strwhere  
        
exec sp_executesql  @varsql, N'@totalcount int output',@totalcount output
        
--计算总页数
        if @TotalCount % @PageSize=0
            
begin
                
set @PageCount=@TotalCount/@PageSize
            
end
        
else
            
begin
                
set @PageCount=@TotalCount/@PageSize +1
            
end
        
--分页提取数据
        set @LowerBound=(@intpage-1)* @pagesize+1
        
set @UpperBound=@LowerBound + @pagesize-1
        
set @varsql='declare @table table (id int identity(1,1) ,nid int);'
        
set @varsql=@varsql+'insert into @table(nid) select top '+str(@UpperBound)+' a.id from jianli a join personinfo b on a.loginid=b.loginid join jiaoyu c on a.loginid=c.loginid join yingpininfo d on a.loginid=d.loginid where a.jlzt=0 '+ @strwhere +'  order by a.riqi desc;'
        
set @varsql=@varsql+'select a.loginid,b.name,b.sex,datediff(yy,b.csny,getdate()) as birthdate,b.workyear,c.zhuanye,c.school,c.xueli ,a.riqi 
                from jianli a join personinfo b on a.loginid=b.loginid join jiaoyu c on a.loginid=c.loginid join yingpininfo d on a.loginid=d.loginid join @table m on a.id=m.nid 
                    where    m.id  between
'+ str(@LowerBound)+' and  '+str(@UpperBound)+' and a.jlzt=0
                        order by a.riqi desc
'
        
select @TotalCount,@PageCount
        
exec sp_executesql @varsql
        
    
end
Tag标签: 临时表,表变量
posted @ 2008-05-25 16:58 wangwang0522 阅读(758) 评论(8)  编辑 收藏 所属分类: sql server性能优化

  回复  引用  查看    
#1楼 2008-05-25 17:34 | 金色海洋(jyk)      
http://www.cnblogs.com/jyk/archive/2008/05/07/1187143.html

这里有两个分页算法。可以参考一下。
  回复  引用  查看    
#2楼 [楼主]2008-05-25 18:00 | wangwang0522      
谢谢一楼的,指点
  回复  引用  查看    
#3楼 2008-05-25 18:25 | PerfectDesign      
大数据量的时候性能超慢
  回复  引用  查看    
#4楼 2008-05-25 18:35 | 金色海洋(jyk)      
1、在sql Server2000 里面对表变量不是太“友好”,也就是说好像没有优化的意思,到了2005里面就好了一点。

2、要想提高效率,其实最主要的是——要设置好索引。索引设置不好的话,任何分页算法都是白费的(在大数据量的时候)。
  回复  引用  查看    
#5楼 2008-05-25 19:55 | PerfectDesign      
@金色海洋(jyk)
表变量是不可以建索引的,所以效率要比临时表慢很多,在数据量大的时候
  回复  引用  查看    
#6楼 [楼主]2008-05-25 20:42 | wangwang0522      
我的数据量一千多万,测试的结果表变量明显强于临时表呀,难道我测试错了
  回复  引用  查看    
#7楼 [楼主]2008-05-25 20:49 | wangwang0522      
其实目前本人自己测试过的最快的分页还是
SELECT TOP 页大小 *
FROM TestTable
WHERE (ID >
(SELECT MAX(id)
FROM (SELECT TOP 页大小*页数 id
FROM 表
ORDER BY id) AS T))
ORDER BY ID
不知道大家有何意见,以上忘了说索引的事了,速度快的前提是索引建立合理。补充上吧。

  回复  引用  查看    
#8楼 2008-07-04 21:00 | 金色海洋(jyk)      
MAX(id)
有很多的限制。只能是一个排序字段,且排序字段没有重复值。
然后你用的是ID,id是聚集索引,这个是最快的。

即使不是聚集索引,建立一个非聚集索引,也是很快的。

这种方法的局限性很大。

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-05-26 14:50 编辑过


相关链接: