在上篇分页文章中介绍了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
rowcnt 同样返回的是总行数。
但这样写后,只需要做一次统计。整个查询2秒就可以了。
最后修改时间:2022-04-22 16:56:49
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。