SQLServer2005和2008的分页技术比较[转]

我们以前在开发大数据量的分页存储过程时,往往都为了怎么样实现高效的性能,而大伤脑筋,似乎总是想写出最佳的存储过程分页方法,我们假如建立一个学生基本信息表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秒。

如果数据涉及到千万级的数据时,比较上面两种方法,就可以看到一些显著的差别了。

SQLServer2005和2008的分页技术比较[转]

时间: 2024-10-01 02:24:56

SQLServer2005和2008的分页技术比较[转]的相关文章

jsp的分页技术

在jsp开发中,很多时候要用到分页技术,另外纯粹的分页实现就占了很多篇幅,所以使用javabean就十分有必要. 此文章依据实际代码,想大家展示jsp中利用javabean实现分页 目录结构如下: javabean的代码如下: package lytjb; import java.sql.ResultSet; import javax.servlet.http.HttpServletRequest; public class fenye { ResultSet CountTopicrs = nu

无刷新分页技术,Ajax+smarty

这里运用Smarty模板,更简单 本文主要的技术:AJAX,PHP,Smarty,另外自己封装了一个很简单的类 类: (function(){    function $(id) {        return document.getElementById(id);    }    $.init=function() {        try{return new XMLHttpRequest();}catch(e){};        try{return new ActiveXObject

浅谈Java分页技术

话不多言.我们要实现java分页技术,我们首先就需要定义四个变量,他们是: int  pageSize;//每页显示多少条记录 int pageNow;//希望现实第几页 int pageCount;//一共有多少页 int rowCount;//一共有多少条记录 说明: 1.pageSize是指定的 2.pageNow是用户选择的 3.rowCount是从表中查询得到的 4.pageCount是计算得到的,该计算为: if(rowCount%pageSize==0) { pageCount=r

sqlserver2005使用row_number() over分页的实现方法

sqlserver2005使用row_number() over分页的实现方法 sqlserver2005使用row_number() over分页的实现方法,需要的朋友可以参考下. 语法:ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN) <BR> 例子: select * from (  select *, ROW_NUMBER() OVER(Order by a.CreateTime DESC ) AS RowNumber fro

MVC分页技术

这个是用的插件分页技术 前台引用和js <script type="text/javascript" src="/js/jquery-1.10.2.min.js"></script> <script type="text/javascript" src="/js/kkpager.min.js"></script> <link rel="stylesheet&quo

Lucene 查询分页技术

常用的Lucene查询代码如下所示,该代码的作用是将path路径下的所有索引信息返回 1 public String matchAll(String path) { 2 try { 3 Directory directory = FSDirectory.open(new File(path)); 4 DirectoryReader reader = DirectoryReader.open(directory); 5 IndexSearcher searcher = new IndexSearc

django分页技术django-pagination和Paginator

转载前还请注明出处:http://blog.csdn.net/gugugujiawei 一.概述 几乎所有的web应用,都需要分页功能,但分页技术总体来说分两种,一种是全部加载,存于浏览器的缓存中,一种是分页访问,部分加载.前一种方法优点是实现简单,在一些对项目要求不多的特定应用上用得较多,可以利用的插件譬如datatables,而后一种方法优点是不会占用服务器太多的缓存,对于数据量大的列表项必须用到这种技术.由于我现在的项目属于管理后台,管理来自成千上万用户的数据,因而只能用到第二种方法.初期

眼下最好的JSP分页技术

2005-08-24   来源:CSDN  作者:wanchao2001 前言     在使用数据库的过程中,不可避免的须要使用到分页的功能,但是JDBC的规范对此却没有非常好的解决.对于这个需求非常多朋友都有自己的解决方式,比方使用 Vector等集合类先保存取出的数据再分页.但这样的方法的可用性非常差,与JDBC本身的接口全然不同,对不同类型的字段的支持也不好.这里提供了一种与 JDBC兼容性非常好的方案.   JDBC和分页 Sun的JDBC规范的制定,有时非常让人哭笑不得,在JDBC1.

25、连接池(DBCP、C3P0)、动态代理与分页技术

连接池 思考: 程序中连接如何管理? 1. 连接资源宝贵:需要对连接管理 2. 连接: a) 操作数据库,创建连接 b) 操作结束, 关闭! 分析: 涉及频繁的连接的打开.关闭,影响程序的运行效率! 连接管理: 预先创建一组连接,有的时候每次取出一个: 用完后,放回: 学习连接池: a. 自定义一个连接池 b. 学习优秀的连接池组件 a) DBCP b) C3P0 动态代理 Java提供了一个Proxy类,调用它的newInstance方法可以生成某个对象的代理对象,使用该方法生成代理对象时,需