Sql Server2005的一个新特性便是我等了很久的Row_Number(),以前用Oracle时用rownumber写分页存储过程很方便:)

下面是我做的一个小小的测试,测试我原来在sql server2000下所用的分页存储过程与使用Row_Number()编写的存储过程在Sql Server2005上的执行效率...

创建数据表
CREATE TABLE [dbo].[test](
[UserId] [int] Primary Key IDENTITY(1,1) ,
[UserName] [nvarchar](256) ,
[Sex] [varchar](50) NOT NULL,
[Age] [int] NOT NULL,
[Address] [varchar](100) ,
[status] [bit] NULL,
[Email] [varchar](100) ,
[InsertDate] [datetime] NOT NULL
)

插入1000k(1百万)记录

declare @n int
set @n = 0
while @n<100000
BEGIN
Insert Into test(UserName,Sex,Age,Address,status,Email,InsertDate)
Values('Name','M','25','Address',1,'EmanLeeA@gmail.com',getdate())
Select @n = @n+1
END

两个存储过程

使用Top的分页存储过程
Create proc [dbo].[test_PageById]
(
@pageIndex int,
@pageSize int
)
AS
SELECT TOP(@pageSize) *
FROM test
WHERE UserId <
(SELECT MIN(UserId) FROM (
SELECT TOP ((@pageIndex-1) * @pageSize) UserId
FROM test
ORDER BY UserId DESC)B )
ORDER BY UserId DESC

使用Row_number的存储过程
CREATE proc [dbo].[test_PageByRowNumber]
(
@pageIndex int,
@pageSize int
)
AS
DECLARE @startRow int, @endRow int
Set @startRow = (@pageIndex - 1) * @pageSize +1
SET @endRow = @startRow + @pageSize -1
SELECT*
FROM (
SELECT *,ROW_NUMBER() OVER (ORDER BY UserId DESC) AS RowNumber
FROM test ) T
WHERE T.RowNumber BETWEEN @startRow AND @endRow

测试和结果

SET STATISTICS io ON
SET STATISTICS time ON
go
EXEC test_PageByRowNumber 1000,50 /* RowNumber存储过程 */
go
SET STATISTICS profile OFF
SET STATISTICS io OFF
SET STATISTICS time OFF

/*结果分析*/
SQL Server 分析和编译时间:
CPU 时间 = 0 毫秒,占用时间 = 1 毫秒。
SQL Server 分析和编译时间:
CPU 时间 = 0 毫秒,占用时间 = 1 毫秒。

SQL Server 执行时间:
CPU 时间 = 0 毫秒,占用时间 = 1 毫秒。

SQL Server 执行时间:
CPU 时间 = 0 毫秒,占用时间 = 1 毫秒。

(50 行受影响)
表 'test'。扫描计数 1,逻辑读取 50098 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

SQL Server 执行时间:
CPU 时间 = 219 毫秒,占用时间 = 213 毫秒。

SQL Server 执行时间:
CPU 时间 = 219 毫秒,占用时间 = 213 毫秒。
SQL Server 分析和编译时间:
CPU 时间 = 0 毫秒,占用时间 = 1 毫秒。

SQL Server 执行时间:
CPU 时间 = 0 毫秒,占用时间 = 1 毫秒。

SQL Server 执行时间:
CPU 时间 = 0 毫秒,占用时间 = 1 毫秒。

测试和结果

SET STATISTICS io ON
SET STATISTICS time ON
go
EXEC test_PageById 1000,50 --执行使用top语句的存储过程
go
SET STATISTICS profile OFF
SET STATISTICS io OFF
SET STATISTICS time OFF

/*结果分析*/
SQL Server 分析和编译时间:
CPU 时间 = 0 毫秒,占用时间 = 1 毫秒。
SQL Server 分析和编译时间:
CPU 时间 = 0 毫秒,占用时间 = 1 毫秒。

(50 行受影响)
表 'test'。扫描计数 2,逻辑读取 153 次,物理读取 0 次,预读 93 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

SQL Server 执行时间:
CPU 时间 = 16 毫秒,占用时间 = 26 毫秒。

SQL Server 执行时间:
CPU 时间 = 16 毫秒,占用时间 = 26 毫秒。
SQL Server 分析和编译时间:
CPU 时间 = 0 毫秒,占用时间 = 1 毫秒。

SQL Server 执行时间:
CPU 时间 = 0 毫秒,占用时间 = 1 毫秒。

SQL Server 执行时间:
CPU 时间 = 0 毫秒,占用时间 = 1 毫秒。

至此可以很直观的看出差距了.使用原来的Top子句的存储过程比使用Row_Number()的存储过程执行时间快了将近10倍.....

其实直接分析语句也可以看出,Row_Number()的效率不会是最高的,因为它必须先为100万条记条生成RowNumber,自然不会快到哪里去了.

不过前者的适应范围有些限制,即必须有一个为数字的唯一字段,如果使用uniqueidentifier为主键的话则不能使用了.
Row_Number分页有很好的通用性和直观易用性,对于数据量较少来说,二者应该不会有很大的区别,使用哪个就看你自己的需要了.

http://blog.csdn.net/showsunrise/archive/2008/09/08/2901627.aspx

转载于:https://www.cnblogs.com/emanlee/archive/2010/02/02/1662278.html

Sql Server 2005 存储过程分页相关推荐

  1. Sql Server 2005自定义分页

    前面一篇随笔,我提到了Sql Server 2000的自定义分页,但是在sql server 2000中,要实现显示某一页,就返回那一页数据的效果的方法实在不尽人意.网上很多通用的分页存储过程,但看着 ...

  2. Microsoft SQL Server 2005 查询分页

    微软新的SQL Server 2005新增了数据库分页功能,以后再也用写复杂不灵活而低效率的分页存储过程. 新的数据库分页功能的核心是一个叫row_number的函数 具体如下: 返回结果集分区内行的 ...

  3. SQL Server 2005: 存储过程签名

    SQLSERVER 2005提供的对存储过程签名(signature)功能是我最喜欢的. 如果我们要编写一个存储过程,执行该存储过程里的代码需要权限P,并且我们想要用户Alice可以执行这个存储过程, ...

  4. Sql Server 2005 row_number()分页性能测试

    现在分页方法大多集中在select top/not in/游标/row_number,而select top分页(在这基础上还有二分法)方法似乎更受大家欢迎,这篇文章并不打算去讨论是否通用的问题,本着 ...

  5. SQL Server 2005存储过程示例

    --有输入参数的存储过程-- create proc GetComment (@commentid int) as select * from Comment where CommentID=@com ...

  6. SQL SERVER 高效存储过程分页(Max/Min方法)

    drop procedure propageset  go Create Procedure ProPageSet @tb varchar(50), --表名  @col varchar(50), - ...

  7. Sql Server 2005 ROW_NUMBER 函数实现分页

    过去用SQL Server 2000分页的,大多都用到了临时表.SQL Server 2005 ROW_NUMBER 函数支持分页,性能据说也非常不错. Paging Records Using SQ ...

  8. ASP.NET 2.0在SQL Server 2005上自定义分页

    这篇文章讲述了如何利用SQL Server 2005的新特性来简单高效的实现分页.对于那些暂时还没用到SQL Server2005的人们,请看在大规模数据中的高效分页方法.如果需要,这篇文章会补上这里 ...

  9. Sql Server 2005 中的row_number() 分页技术

    原文发布时间为:2009-05-08 -- 来源于本人的百度文章 [由搬家工具导入] 在Sql Server 2005中,我们可以利用新增函数row_number()来更高效的实现分页存储 CREAT ...

最新文章

  1. centOS6.5安装SUN-jdk7
  2. 每个c语言程序写完后 都要按照,c语言基础学习小结(习题总结)(5页)-原创力文档...
  3. CentOS7内核升级
  4. 韩国IT业是怎么走向国际我们须要学习什么
  5. line-height与图片底部间隙的学习整理转述
  6. ado jet 反复连接 未指定的错误_为什么驱动器的PE端要和变压器中性点有可靠连接?...
  7. find5 android 4.3,OPPO Find 7的手机系统是什么?能升级安卓4.3吗?
  8. [E]PSM算法简析
  9. 单个字段中根据条件剔除数据
  10. 利用“微PE”自制PE可引导iso
  11. LeetCode二叉树中序遍历
  12. InkScape:制作简易LOGO
  13. MCS-51系列单片机指令表
  14. 舌尖上的中国各地特色小吃,怀念家乡的味道!
  15. uniapp请求的封装
  16. 小红书-内卖秒杀项目总结
  17. 基于锁相环的直流电机控制系统simulink仿真
  18. Python 集合与集合运算
  19. 单键模式_购买单键或更换整个键盘是否更好?
  20. 广义相对论-学习记录9-第四章-相对论性的引力理论2

热门文章

  1. Pytorch框架的深度学习优化算法集(优化中的挑战)
  2. 【408预推免复习】计算机网络(谢希仁第七版)第二章——物理层
  3. 机器学习之交叉验证方法详解【基于Scikit-Learn】
  4. python【力扣LeetCode算法题库】322-零钱兑换(动态规划)
  5. python【力扣LeetCode算法题库】13- 罗马数字转整数
  6. python【蓝桥杯vip练习题库】ADV-236林丹大战李宗伟
  7. Android移动开发之【Android实战项目】DAY9-LineChart的使用
  8. 基于移动位置服务器,移动定位服务器的设计与实现
  9. java 随机数生成实现_Java中生成随机数的实现方法总结
  10. 点到直线的投影公式_12分高考答题必刷题型,“空间向量分析点到线的距离问题”...