MySQL社区

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
查看: 5970|回复: 0
打印 上一主题 下一主题

[SQLServer] 比较SQL Server 2005与SQL Server 2000分页技巧

[复制链接]
跳转到指定楼层
1#
发表于 2008-4-10 10:43:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
(以下文章为转贴,若文章、软件包含破解及注册码均由网上搜集,若无意中侵犯到您的权利,敬请来信联系我们,我们马上删除 ...)
  
我们以前在开发大数据量的分页存储过程时,往往都为了怎么样实现高效的性能,而大伤脑筋,似乎总是想写出最佳的存储过程分页方法,我们假如建立一个学生基本信息表StudentInfo,我们看在Sql Server 2000中我们实现的存储过程:
CREATE  PROCEDURE p_GetStudentInfo
@strWhere   varchar(1500)   -- 查询条件 (注意: 不要加 where)
,@PageSize    int = 50          -- 页尺寸
,@PageIndex   int = 1           -- 页码
AS
BEGIN
declare @strSQL   varchar(5000)       -- 主语句
declare @strTmp   varchar(110)        -- 临时变量
declare @strOrder varchar(400)        -- 排序类型

set @strTmp = '<(select min'
set @strOrder = ' order by studentinfoid desc'

if @PageIndex = 1
begin
     if @strWhere != ''   
     set @strSQL = 'select top ' + str(@PageSize) +' *  from studentinfo where ' + @strWhere + ' ' + @strOrder
      else
      set @strSQL = 'select top ' + str(@PageSize) +'  *   from studentinfo '+ @strOrder
--如果是第一页就执行以上代码,这样会加快执行速度
end
else
begin
--以下代码赋予了@strSQL以真正执行的SQL代码
set @strSQL = 'select top ' + str(@PageSize) +'  *  from studentinfo
where studentinfoid' + @strTmp + '(studentinfoid) from (select top ' + str((@PageIndex-1)*@PageSize) + ' studentinfoid from studentinfo' + @strOrder + ') as tblTmp)'+ @strOrder
if @strWhere != ''
     set @strSQL = 'select top ' + str(@PageSize) +'  * from studentinfo
      where studentinfoid' + @strTmp + '(studentinfoid) from
    (select top ' + str((@PageIndex-1)*@PageSize) + ' studentinfoid from studentinfo where ' + @strWhere + ' '
         + @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder
end
--print (@strSQL)
exec (@strSQL)

END
GO

  我们在上面的存储过程中可以看到,如果执行的是第一页的记录时,我们可以看到只执行
  'select top ' + str(@PageSize) +' * from studentinfo where ' + @strWhere + ' ' + @strOrder
  就可以了,而如果翻页的时候,就会在条件查询中又嵌套子查询,势必性能会有所下降,而这个已经在我们Sql Server2000中算是高效的分页存储过程实现方式了,而现在如果我们换作Sql Server 2005的时候,我们是不是还是用这种方式呢?
  在Sql Server 2005中,我们可以利用新增函数row_number()来更高效的实现分页存储
  CREATE PROCEDURE p_GetStudentInfo
  @PageSize INT,
  @PageIndex INT,
  @strWhere varchar(1500) -- 查询条件(注意: 不要加where)
  As
  Begin
  select * from (
  select row_number() over (order by StudentInfoId) row,* from StudentInfo ) StudentInfo
  where row between @PageSize*(@PageIndex-1) and @PageSize*@PageIndex
  End
  go

  依照群组显示每条记录在该群组中出现的顺序位置,在显示每条记录编号时非常有用,并且搭配OVER子句,这样就可以实现查询记录的条数了。
  我们现在来比较一下它们执行的性能,StudentInfo表中现在有30多万条数据,我们分别来执行下面的存储过程:
  Exec p_GetStudentInfo
  @PageSize = 10000,
  @PageIndex = 10,
  @strWhere = '1=1'


  在Sql Server 2000中,执行的时间是接近2秒;
  在Sql Server 2005中,执行的时间显示的是接近0秒。

  如果数据涉及到千万级的数据时,比较上面两种方法,就可以看到一些显著的差别了。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 分享淘帖 顶 踩
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|申请友链|小黑屋|Archiver|手机版|MySQL社区 ( 京ICP备07012489号   
联系人:周生; 联系电话:13911732319

GMT+8, 2024-5-5 23:24 , Processed in 0.078099 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表