在上篇分页文章中介绍了2012的新特性
SQL Server分页优化(一)
但在上一篇文章中,离标准分页,缺少一个重要返回值,那就是符合条件的结果总共有多少行。这个值返回后,前端才能根据用户定义的每页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