SQL SERVER 2008 中三种分页方法与总结

建立表:

 1 CREATE TABLE [TestTable] (
 2  [ID] [int] IDENTITY (1, 1) NOT NULL ,
 3  [FirstName] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,
 4  [LastName] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,
 5  [Country] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
 6  [Note] [nvarchar] (2000) COLLATE Chinese_PRC_CI_AS NULL
 7 ) ON [PRIMARY]
 8 GO
 9
10 插入数据:(2万条,用更多的数据测试会明显一些)
11 SET IDENTITY_INSERT TestTable ON
12 declare @i int
13 set @i=1
14 while @i<=20000
15 begin
16     insert into TestTable([id], FirstName, LastName, Country,Note) values(@i, ‘FirstName_XXX‘,‘LastName_XXX‘,‘Country_XXX‘,‘Note_XXX‘)
17     set @i=@i+1
18 end
19 SET IDENTITY_INSERT TestTable OFF

分页方案一:(利用Not In和SELECT TOP分页)

 1 SELECT TOP 10 *
 2 FROM TestTable
 3 WHERE (ID NOT IN
 4           (SELECT TOP 20 id
 5          FROM TestTable
 6          ORDER BY id))
 7 ORDER BY ID
 8
 9 SELECT TOP 页大小 *
10 FROM TestTable
11 WHERE (ID NOT IN
12           (SELECT TOP 页大小*页数 id
13          FROM 表
14          ORDER BY id))
15 ORDER BY ID

分页方案二:(利用ID大于多少和SELECT TOP分页)

 1 SELECT TOP 10 *
 2 FROM TestTable
 3 WHERE (ID >
 4           (SELECT MAX(id)
 5          FROM (SELECT TOP 20 id
 6                  FROM TestTable
 7                  ORDER BY id) AS T))
 8 ORDER BY ID
 9
10 SELECT TOP 页大小 *
11 FROM TestTable
12 WHERE (ID >
13           (SELECT MAX(id)
14          FROM (SELECT TOP 页大小*页数 id
15                  FROM 表
16                  ORDER BY id) AS T))
17 ORDER BY ID

分页方案三:(利用SQL的游标存储过程分页)

 1 create  procedure XiaoZhengGe
 2 @sqlstr nvarchar(4000), --查询字符串
 3 @currentpage int, --第N页
 4 @pagesize int --每页行数
 5 as
 6 set nocount on
 7 declare @P1 int, --P1是游标的id
 8  @rowcount int
 9 exec sp_cursoropen @P1 output,@sqlstr,@scrollopt=1,@ccopt=1,@rowcount=@rowcount output
10 select ceiling(1.0*@rowcount/@pagesize) as 总页数--,@rowcount as 总行数,@currentpage as 当前页
11 set @currentpage=(@currentpage-1)*@pagesize+1
12 exec sp_cursorfetch @P1,16,@currentpage,@pagesize
13 exec sp_cursorclose @P1
14 set nocount off

其它的方案:如果没有主键,可以用临时表,也可以用方案三做,但是效率会低。
建议优化的时候,加上主键和索引,查询效率会提高。

总结:
分页方案二:(利用ID大于多少和SELECT TOP分页)效率最高,需要拼接SQL语句
分页方案一:(利用Not In和SELECT TOP分页)   效率次之,需要拼接SQL语句
分页方案三:(利用SQL的游标存储过程分页)    效率最差,但是最为通用
在实际情况中,要具体分析。

时间: 2024-10-08 01:42:57

SQL SERVER 2008 中三种分页方法与总结的相关文章

sql server 2008 中使用EF分页

InnerException = {System.Data.SqlClient.SqlException (0x80131904): 'OFFSET' 附近有语法错误.在 FETCH 语句中选项 NEXT 的用法无效.   在 System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)   在 System.Data

SQL Server数据库的三种恢复模式:简单恢复模式、完整恢复模式和大容量日志恢复模式

SQL Server数据库的三种恢复模式:简单恢复模式.完整恢复模式和大容量日志恢复模式 这篇文章主要介绍了SQL Server数据库的三种恢复模式:简单恢复模式.完整恢复模式和大容量日志恢复模式,需要的朋友可以参考下 如何图形界面下修改恢复模式 找到你想修改的数据库 右键 > 属性  > 左侧 选项既可看到 1.Simple 简单恢复模式, Simple模式的旧称叫"Checkpoint with truncate log",其实这个名字更形象,在Simple模式下,SQ

转:访问 Microsoft SQL Server 元数据的三种方法

上海微创软件有限公司 肖桂东 适用读者:Microsoft SQL Server 中.高级用户 元数据简介 元数据 (metadata) 最常见的定义为"有关数据的结构数据",或者再简单一点就是"关于数据的信息",日常生活中的图例.图书馆目录卡和名片等都可以看作是元数据.在关系型数据库管理系统 (DBMS) 中,元数据描述了数据的结构和意义.比如在管理.维护 SQL Server 或者是开发数据库应用程序的时候,我们经常要获取一些涉及到数据库架构的信息:某个数据库中

SQL Server 2008中的9种数据挖掘算法

1.决策树算法 决策树,又称判定树,是一种类似二叉树或多叉树的树结构.决策树是用样本的属性作为结点,用属性的取值作为分支,也就是类似流程图的过程,其中每个内部节点表示在一个属性上的测试,每个分支代表一个测试输出,而每个树叶节点代表类或类分布.它对大量样本的属性进行分析和归纳.根结点是所有样本中信息量最大的属性,中间结点是以该结点为根的子树所包含的样本子集中信息量最大的属性,决策树的叶结点是样本的类别值. 从树的根结点出发,将测试条件用于检验记录,根据测试结果选择适当的分支,沿着该分支或者达到另一

SQL SERVER 2008中使用VARBINARY(MAX)进行图像存取的实现方法

在数据库应用项目开发中,经常会使用一些二进制的图像数据,存储和读取显示图像数据主要采用的是路径链接法和内存流法.路径链接法是将图像文件保存在固定的路径下,数据库中只存储图像文件的路径和名称,此方法数据库容量小,存取速度快,但安全性较差:内存流法是将二进制数据直接存储在数据库中,此方法对数据的共享非常方便,安全性相对较高,常用于图像容量不是很大的时候. 本文主要讨论通过SQL Server 2008使用内存流法如何实现二进制图像数据的存储. 1 VARBINARY(MAX)数据类型简介 在SQL

利用Ring Buffer在SQL Server 2008中进行连接故障排除

原文:利用Ring Buffer在SQL Server 2008中进行连接故障排除 出自:http://blogs.msdn.com/b/apgcdsd/archive/2011/11/21/ring-buffer-sql-server-2008.aspx SQL Server 2008中包含一个新功能,旨在帮助解决特别棘手的连接问题.这个新功能是Connectivity Ring Buffer,它可以捕捉每一个由服务器发起的连接关闭记录(server-initiated connection

【转载】SQL Server 2008 中新建用户登录并指定该用户的数据库

提要:我在 SQL Server 中新建用户登录时,出现了三种错误,错误代码分别是 18456.15128.4064 -----------------------------------  正 文 ----------------------------------- 一.实验环境 Windows 7SQL Server 2008数据库实例名为 TestDB,新建的用户名为 testUser 二.操作步骤 1.打开 SQL Server Management Studio,以 Windows身

在SQL Server 2008中调用.net,dll

T-SQL的在执行普通的查询的时候是很高效的,但是在执行循环,判断这样的语句的时候效率就不那么的高了.这时可以借助CLR了,我们可以在SQL Server 2008中扩展C#程序来完成循环等过程式的查询,或者其他SQL不便实现的功能.这个随笔中将介绍在SQL Server中扩展C#程序实现正则表达式的替换功能. 新建一个类库程序命名为Regex,打开Visual Studio 2008,点击File,点击New,点击Project,在弹出的New Project对话框中选择Class Libra

SQL Server 2008中的数据压缩

SQL Server 2008中引入了数据压缩的功能,允许在表.索引和分区中执行数据压缩.这样不仅可以大大节省磁盘的占用空间,还允许将更多数据页装入内存中,从而降低磁 盘IO,提升查询的性能.当然,凡事有利有弊,在启用数据压缩后,数据库服务器就需要额外的CPU资源来进行压缩处理.一般说来,数据库服务器的CPU占 用率不会太高,而磁盘IO容易成为瓶颈,所以在大多数情况下对大数据库特别是数据仓库启用该项功能还是利大于弊.SQL Server 2008的数据压缩分为行压缩和页压缩两种.行压缩主要是通过