[转]SQL Server 存储过程的分页方案比拼

 

  1SQL Server 存储过程的分页,这个问题已经讨论过几年了,很多朋友在问我,所以在此发表一下我的观点
  2建立表:
  3
  4CREATE TABLE [TestTable] (
  5 [ID] [int] IDENTITY (1, 1) NOT NULL ,
  6 [FirstName] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,
  7 [LastName] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,
  8 [Country] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
  9 [Note] [nvarchar] (2000) COLLATE Chinese_PRC_CI_AS NULL 
 10) ON [PRIMARY]
 11 GO
 12 
 13  
 14 插入数据:(2万条,用更多的数据测试会明显一些)
 15 SET IDENTITY_INSERT TestTable ON
 16 
 17 declare @i int
 18 set @i=1
 19 while @i<=20000
 20 begin
 21     insert into TestTable([id], FirstName, LastName, Country,Note) values(@i, 'FirstName_XXX','LastName_XXX','Country_XXX','Note_XXX')
 22     set @i=@i+1
 23 end
 24 
 25 SET IDENTITY_INSERT TestTable OFF
 26 
 27  
 28 
 29 -------------------------------------
 30 
 31 分页方案一:(利用Not In和SELECT TOP分页)
 32 语句形式:
 33 SELECT TOP 10 *
 34 FROM TestTable
 35 WHERE (ID NOT IN
 36           (SELECT TOP 20 id
 37          FROM TestTable
 38          ORDER BY id))
 39 ORDER BY ID
 40 
 41 
 42 SELECT TOP 页大小 *
 43 FROM TestTable
 44 WHERE (ID NOT IN
 45           (SELECT TOP 页大小*页数 id
 46          FROM 表
 47          ORDER BY id))
 48 ORDER BY ID
 49 
 50 -------------------------------------
 51 
 52 分页方案二:(利用ID大于多少和SELECT TOP分页)
 53 语句形式:
 54 SELECT TOP 10 *
 55 FROM TestTable
 56 WHERE (ID >
 57           (SELECT MAX(id)
 58          FROM (SELECT TOP 20 id
 59                  FROM TestTable
 60                  ORDER BY id) AS T))
 61 ORDER BY ID
 62 
 63 
 64 SELECT TOP 页大小 *
 65 FROM TestTable
 66 WHERE (ID >
 67           (SELECT MAX(id)
 68          FROM (SELECT TOP 页大小*页数 id
 69                  FROM 表
 70                  ORDER BY id) AS T))
 71 ORDER BY ID
 72 
 73 
 74 -------------------------------------
 75 
 76 分页方案三:(利用SQL的游标存储过程分页)
 77 create  procedure XiaoZhengGe
 78 @sqlstr nvarchar(4000), --查询字符串
 79 @currentpage int, --第N页
 80 @pagesize int --每页行数
 81 as
 82 set nocount on
 83 declare @P1 int, --P1是游标的id
 84  @rowcount int
 85 exec sp_cursoropen @P1 output,@sqlstr,@scrollopt=1,@ccopt=1,@rowcount=@rowcount output
 86 select ceiling(1.0*@rowcount/@pagesize) as 总页数--,@rowcount as 总行数,@currentpage as 当前页 
 87 set @currentpage=(@currentpage-1)*@pagesize+1
 88 exec sp_cursorfetch @P1,16,@currentpage,@pagesize 
 89 exec sp_cursorclose @P1
 90 set nocount off
 91 
 92 其它的方案:如果没有主键,可以用临时表,也可以用方案三做,但是效率会低。
 93 建议优化的时候,加上主键和索引,查询效率会提高。
 94 
 95 通过SQL 查询分析器,显示比较:我的结论是:
 96 分页方案二:(利用ID大于多少和SELECT TOP分页)效率最高,需要拼接SQL语句
 97 分页方案一:(利用Not In和SELECT TOP分页)   效率次之,需要拼接SQL语句
 98 分页方案三:(利用SQL的游标存储过程分页)    效率最差,但是最为通用
 99
100在实际情况中,要具体分析。

时间: 2024-07-30 19:00:08

[转]SQL Server 存储过程的分页方案比拼的相关文章

SQL Server 存储过程的分页方案比拼

server|存储过程|分页 SQL Server 存储过程的分页,这个问题已经讨论过几年了,很多朋友在问我,所以在此发表一下我的观点建立表: CREATE TABLE [TestTable] ( [ID] [int] IDENTITY (1, 1) NOT NULL , [FirstName] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL , [LastName] [nvarchar] (100) COLLATE Chinese_PRC_CI_

SQL Server 存储过程的分页

server|存储过程|分页 SQL Server 存储过程的分页,这个问题已经讨论过几年了,很多朋友在问我,所以在此发表一下我的观点建立表: CREATE TABLE [TestTable] ( [ID] [int] IDENTITY (1, 1) NOT NULL , [FirstName] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL , [LastName] [nvarchar] (100) COLLATE Chinese_PRC_CI_

SQL Server 存储过程的分页_存储过程

建立表:  CREATE TABLE [TestTable] (  [ID] [int] IDENTITY (1, 1) NOT NULL ,  [FirstName] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,  [LastName] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,  [Country] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS 

Sql Server 存储过程中查询数据无法使用 Union(All)

原文:Sql Server 存储过程中查询数据无法使用 Union(All) 微软Sql Server数据库中,书写存储过程时,关于查询数据,无法使用Union(All)关联多个查询.     1.先看一段正常的SQL语句,使用了Union(All)查询:      SELECT ci.CustId --客户编号 , ci.CustNam --客户名称 , ci.ContactBy --联系人 , ci.Conacts --联系电话 , ci.Addr -- 联系地址 , ci.Notes --

SQL Server存储过程及高级应用

原文 http://www.cnblogs.com/weilengdeyu/archive/2013/06/11/3131516.html 今天主要探讨下SQL Server存储过程的应用及优化方案.      存储过程:由于本人之前的一篇文章对存储过程简单的做了概述,http://www.cnblogs.com/weilengdeyu/archive/2012/12/26/2834625.html这里就不再赘述了.今天来看下存储过程的高级应用. 首先来看下存储过程能够包含哪些内容:      

SQL Server使用row_number分页的实现方法_MsSql

本文为大家分享了SQL Server使用row_number分页的实现方法,供大家参考,具体内容如下 1.首先是 select ROW_NUMBER() over(order by id asc) as 'rowNumber', * from table1 生成带序号的集合 2.再查询该集合的 第 1  到第 5条数据 select * from (select ROW_NUMBER() over(order by id asc) as 'rowNumber', * from table1) a

SQL Server使用row_number分页的实现方法

本文为大家分享了SQL Server使用row_number分页的实现方法,供大家参考,具体内容如下 1.首先是 select ROW_NUMBER() over(order by id asc) as 'rowNumber', * from table1 生成带序号的集合 2.再查询该集合的 第 1  到第 5条数据 select * from (select ROW_NUMBER() over(order by id asc) as 'rowNumber', * from table1) a

SQL SERVER存储过程语法详解

SQL SERVER存储过程语法: Create PROC [ EDURE ] procedure_name [ ; number ] [ { @parameter data_type } [ VARYING ] [ = default ] [ OUTPUT ] ] [ ,...n ] [ WITH { RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ] [ FOR REPLICATION ] AS sql_statement [ ...n ]

JSP中调用SQL Server存储过程实例讲解

下面介绍一个JSP调用SQL Server存储过程的实例: 创建表: CREATE TABLE [BookUser] (     [UserID] [int] IDENTITY (1, 1) NOT NULL ,     [UserName] [varchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,     [Title] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,     [Guid]