Sql數據層分頁技術

看了一篇講座,說到數據層分頁技術,用到了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方式是反覆的去查,消耗了時間。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章