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分頁有很好的通用性和直觀易用性,對於數據量較少來說,二者應該不會有很大的區別,使用哪個就看你自己的需要了.