SQL 2012 OFFSET/FETCH NEXT分页示例与row_number分页比较

  • /*  
  • 执行脚本去创建这个表并插入数据。  
  • */  
  • IF OBJECT_ID('Customers','U'IS NOT NULL  
  •     DROP TABLE Customers  
  •    
  • CREATE TABLE Customers (  
  •     CustomerID INT,  
  •     CustomerNumber CHAR(4),  
  •     CustomerName VARCHAR(50),  
  •     CustomerCity VARCHAR(20) )  
  • GO  
  •    
  • INSERT INTO Customers (  
  •     CustomerID, CustomerNumber, CustomerName, CustomerCity  
  • )  
  • SELECT  
  •     Number,  
  •     REPLACE(STR(Number, 4), ' ''0'),  
  •     'Customer ' + STR(number,6),  
  •     CHAR(65 + (number % 26)) + '-City'  
  • FROM master..spt_values WHERE type = 'p'  
  •     AND number BETWEEN 0 AND 999  
  •    
  • /*  
  • 用ROW_NUMBER()的分页示例- SQL Server 2005/2008 版本。  
  • */  
  •    
  • DECLARE @page INT, @size INT  
  • SELECT @page = 3, @size = 10  
  •    
  • ;WITH cte AS (  
  •     SELECT  TOP (@page * @size)  
  •         CustomerID,  
  •         CustomerName,  
  •         CustomerCity,  
  •         ROW_NUMBER() OVER(ORDER BY CustomerName ) AS Seq,  
  •         COUNT(*) OVER(PARTITION BY ''AS Total  
  •     FROM Customers  
  •     WHERE CustomerCity IN ('A-City','B-City')  
  •     ORDER BY CustomerName ASC  
  • )  
  • SELECT  
  •     *  
  • FROM cte  
  • WHERE seq BETWEEN (@page - 1 ) * @size + 1 AND @page * @size  
  • ORDER BY seq  
  •    
  • /*  
  • SQL Server 2012中新添加的分页示例  
  • */  
  •    
  • DECLARE @page INT, @size INT  
  • SELECT @page = 3, @size = 10  
  •    
  • SELECT  
  •     *,  
  •     COUNT(*) OVER(PARTITION BY ''AS Total  
  • FROM Customers  
  • WHERE CustomerCity IN ('A-City','B-City')  
  • ORDER BY CustomerID  
  • OFFSET (@page -1) * @size ROWS  
  • FETCH NEXT @size ROWS ONLY;  
  •    
  • /*  
  • 同时执行这两个版本,打开执行计划,你可以注意到在这个例子中显著的性能差异。  
  • */  
posted @ 2013-07-18 16:52  mimo0  阅读(209)  评论(0)    收藏  举报