看了一篇講座,說到數據層分頁技術,用到了4中方式,1)使用top *top 2)使用表變量 3)使用臨時表 4)使用ROW_NUMBER函數。
其中最快的是第1 和第4中方式,接下來我們來看看這兩種方式:
我們使用sql2005自帶的數據庫 AdventureWorks測試,
1)
--Use Top*Top
DECLARE @Start datetime,@end datetime;
SET @Start=getdate();
DECLARE @PageNumber INT, @Count INT, @Sql varchar(max);
SET @PageNumber=5000;
SET @Count=10;
SET @Sql='SELECT T2.* FROM (
SELECT TOP 10 T1.* FROM
(SELECT TOP ' + STR(@PageNumber*@Count) +' * FROM Production.TransactionHistoryArchive
ORDER BY ReferenceOrderID ASC) AS T1
ORDER BY ReferenceOrderID DESC) AS T2
ORDER BY ReferenceOrderID ASC';
EXEC (@sql);
SET @end=getdate();
PRINT Datediff(millisecond,@Start,@end);
GO
解析:我們是要查出第5000頁,每頁10條,也就是第49991~第50000條,
先select出前50000條,再倒序出後10條,再升序排列,也就是49991~50000條,執行時間爲373毫秒。
2)
--Use ROW_NUMBER
DECLARE @Start datetime,@end datetime;
SET @Start=getdate();
DECLARE @PageNumber INT, @Count INT, @Sql varchar(max);
SET @PageNumber=5000;
SET @Count=10;
SELECT * FROM
( SELECT ROW_NUMBER()
OVER(ORDER BY ReferenceOrderID) AS RowNumber,
*
FROM Production.TransactionHistoryArchive) AS T
WHERE T.RowNumber<=@PageNumber*@Count AND T.RowNumber>(@PageNumber-1)*@Count;
SET @end=getdate();
PRINT Datediff(millisecond,@Start,@end);
GO
解析:也是要查出第5000頁,每頁10條。先將數據全部排名,再where兩個條件,一個是排名<=5000*10=50000條 並且排名>4999*10=49990條,也就是49991到50000條。 執行時間爲156,這種方式更優。主要是top方式是反覆的去查,消耗了時間。