1. ROW_NUMBER() 的分页方法
DECLARE @currentPage INT =2,@pageSize INT =5;
WITH cte AS(
SELECT ROW_NUMBER() OVER(ORDER BY OrderId desc) rowid,* FROM dbo.EC_Orders)
SELECT * FROM cte WHERE rowid > (@currentPage-1)*@pageSize AND rowid<= @currentPage*@pageSize
2. Offset and Fetch 的分页方法
DECLARE @currentPage INT =2,@pageSize INT =5;
SELECT * FROM dbo.EC_Orders ORDER BY OrderId DESC OFFSET (@currentPage-1)*@pageSize ROW FETCH NEXT @pageSize ROWS ONLY
综合性能比较:
在 Sql Server 2012 里面,分页方法中,Offset and Fetch 同 ROW_NUMBER() 比较起来,无论是性能还是语法,都是有优势的。
但是性能方面,优势并不是太大,两者 的 IO 消耗完全相同,只是 在 CPU 方面,Offset and Fetch 方面要好一些,但是不明显。如果对于一个 每秒都要处理成千上万条的分页Sql语句的DB 来说,Offset and Fetch 在CPU 方面的优势会比较明显的,否则,性能的提升并不明显。
语法方面 Offset and Fetch 则是十分的简洁,一句搞定,比起 Row_Number() 好了太多