Sql Server2005的一个新特性便是我等了很久的Row_Number(),以前用Oracle时用rownumber写分页存储过程很方便:)
下面是我做的一个小小的测试,测试我原来在sql server2000下所用的分页存储过程与使用Row_Number()编写的存储过程在Sql Server2005上的执行效率...
数据表:
REATE 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 ) |
use temp declare @n int |
两个存储过程
原来使用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* |
测试和结果
SET STATISTICS io ON /*结果分析*/ SQL Server 执行时间: SQL Server 执行时间: (50 行受影响) SQL Server 执行时间: SQL Server 执行时间: SQL Server 执行时间: SQL Server 执行时间: |
SET STATISTICS io ON (50 行受影响) SQL Server 执行时间: SQL Server 执行时间: SQL Server 执行时间: SQL Server 执行时间: |
至此可以很直观的看出差距了.使用原来的Top子句的存储过程比使用Row_Number()的存储过程执行时间快了将近10倍.....
其实直接分析语句也可以看出,Row_Number()的效率不会是最高的,因为它必须先为100万条记条生成RowNumber,自然不会快到哪里去了.
不过前者的适应范围有些限制,即必须有一个为数字的唯一字段,如果使用uniqueidentifier为主键的话则不能使用了.
Row_Number分页有很好的通用性和直观易用性,对于数据量较少来说,二者应该不会有很大的区别,使用哪个就看你自己的需要了.