再谈分页优化

数据库分页是一个非常重要的技能。因为我们一定会在数据库分页,减少一次性返回给前端数据不要太大,也能极大的提升查询性能。

对分页写法有疑问的,可参照我以前写的一篇文章
https://www.jianshu.com/p/80bd9dbcdb90

但上一篇文章中,缺少一个重要返回值,那就是符合条件的结果总共有多少行。这个值返回后,前端才能根据用户定义的每页X条,算出总共会有多少页。

还是拿上一篇的笛卡尔积来做测试

set statistics time on;
declare @pageindex  int --页数
declare @pagesize int --每页记录数
set  @pageindex = 1
set  @pagesize = 100

select a.*,count(*) over() as rowcnt 
from syscolumns as a, syscolumns as b
order by a.id
offset ((@pageIndex-1)*@pageSize) rows
fetch next @pageSize rows only;

利用窗口函数,返回 rowcnt这个总行数,但实际执行发现,这个SQL 执行需要在10分钟以上
原因在于,窗口函数,每行都需要计算一次总行数,而我这个结果集实际有5亿多条记录。

那进行改写

set statistics time on;
declare @pageindex  int --页数
declare @pagesize int --每页记录数
set  @pageindex = 1
set  @pagesize = 100

;with cte as 
(
select a.*
from syscolumns as a
cross join syscolumns as b
)
select * from cte 
cross join (select count(*) as rowcnt from cte) as t1
order by id
offset ((@pageIndex-1)*@pageSize) rows
fetch next @pageSize rows only

这样写后 整个查询2秒出结果。

分页查询还有诸多技术(比如延迟关联),以后有空再慢慢写案例分享

你可能感兴趣的:(再谈分页优化)