SQL Server 分页查询

在开发电商商品列表展示、后台管理系统数据分页、日志查询系统等需要处理万级以上数据集的业务场景里,使用SQL分页查询,分段加载数据能大大减轻对性能和资源的爆发式消耗,改善用户体验。不同SQL Server版本的分页查询语法不同,分别介绍如下。

SQL Server 2000

Select top @pSize * from ieProd d1 with (NOLOCK)
Where ProdRecID < (select min(ProdRecID) from 
   (select top @pLast ProdRecID from ieProd order by ProdRecID DESC)as d2)
 order by ProdRecID DESC

注意事项:@pSize代表每页几条记录;@pLast代表从第几条开始取;@pLast=pSize*页数。
前端在执行前用具体的数量代替@pSize和@pLast。查询结果排序从大到小。
实测效率高,但没有sql2008方案高。

SQL Server 2008

Declare @PageIndex int = 2;
Declare @PageSize int = 10;
Declare @StartRow int, @EndRow int;

SET @StartRow = (@PageIndex - 1) * @PageSize + 1;
SET @EndRow = @PageIndex * @PageSize;

WITH PageData AS (
    SELECT EmployeeID,Number,Chinesename,ROW_NUMBER() OVER (order by EmployeeID) AS RowNum
    FROM Employees WITH (NOLOCK)
    WHERE 1=1
)
SELECT * FROM PageData
WHERE RowNum BETWEEN @StartRow and @EndRow

设计要点:前端传递两个参数:第几页@PageIndex/每页几条记录@PageSize。
或者前端在执行前用具体的数量代替@StartRow和@EndRow
注意事项:where里的栏位要有索引;Order By也要有索引且唯一。
实测效率很高,即使with里查询超过5秒,但整个代码不到1秒。

SQL Server 2012+

SELECT * FROM Employees
ORDER BY EmployeeID 
OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY;

设计要点:前端给10赋予一个真实的数量。

发表评论