在开发电商商品列表展示、后台管理系统数据分页、日志查询系统等需要处理万级以上数据集的业务场景里,使用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赋予一个真实的数量。
