• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

炼丹炉中的孙悟空

Only For Study
  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

也谈分页存储过程的问题,堪称史上最强分页存储过程!

看到了园子里很多同志们探讨分页取数据的问题,有的是纯粹的存储过程,有的是拼凑sql字符串,各说各的好,暂且不论,有一种新的方式暂时没有看到大家发布,今天发布出来,欢迎拍砖一起进步

    看到了园子里很多同志们探讨分页取数据的问题,有的是纯粹的存储过程,有的是拼凑sql字符串,各说各的好,暂且不论,有一种新的方式暂时没有看到大家发布,今天发布出来,欢迎拍砖一起进步!

    一、很久以前:

            很久以前,我们使用标准的分页存储过程,无论任何分页控件几乎采用一致的分页存储过程,比如我们的网站生活网(http://www.shenghuo.cn)采用的就是吴旗娃的分页控件,标准的存储过程如下:

                   

Code
create proc pageTest
    
@pageSize int,
    
@pageIndex int
as
declare  @temp table(id int identity(1,1) ,tid int)
declare @pageStart int
declare @pageEnd int 
set @pageStart = @pageIndex * @pageSize
set @pageEnd = @pageStart + @pageSize

insert into @temp (tid)    select po_id from **_header order by po_id desc
select z.po_id,z.iid_nbr 
    
from **_header z 
    
inner join @temp t    on z.po_id = t.tid
                        
and t.id between @pageStart and @pageEnd-1 
    
order by t.id desc

 

            如上所述,首先构建临时表,计算起始条数和结束条数。然后量表联合搜索我们需要的数据,在一个41716条数据的环境测试下的时间为00:00:05。可见数据如果为百万级的话我们就会为这个东东等待多久!

       二、现在的东东

            有了sql2005后,微软为我们引入了一种全新的表达式,那就是CTE(公用表表达式),可是用with temp as的方式将数据临时取出,然后select这个temp,结合over函数将使我们分页取数据得到质的提升,

                   说明:

                        1、over 相当于聚合函数,只能出现在select阶段和orderby 阶段

                        2、由于with还有其他作用,所以在使用with之前,with之上的sql语句一定要使用“,”结束,虽然sql2005不强制我们使用“,”结束语句,但是这是一个好习惯

            废话少说来看新的存储过程

                  

Code
create proc pageTest1
@pageSize int,
@pageIndex int
as
with temp as
(
select row_number()over(order by po_id asc) as rownum,* from po_header)
select * from temp 
    
where rownum between @pageIndex * @pageSize and @pageIndex * @pageSize+@pageSize -1

 

                  看到了吗?代码简单明了,我们使用了select * 和老得存储过程的select po_id,iid_nbr做比较,结果这个新的存储过程取出10条的时间是:00:00:00,几乎不需要时间,这就是差距,也是sql2005带给我们的极大的便利,非常的简单易用,用到了sql2005的一个新特性而已,却解决了我们很大的问题,如果大家还有新的更好的方式欢迎拍砖!

                  

Jake

http://www.shenghuo.cn

转载注明出处!

posted on 2009-05-26 14:18  Jake.SHI  阅读(3831)  评论(59)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3