SQL优化:采用新语法提升分页性能(本质上就是新的算法)

本文主讲分页方法的性能,这里不考虑表没有索引的情况,在分页id上都建有索引,表记录数为 432万条

之前在某一篇文章的评论里看到,写sql无非就是增删改查,没什么难的,采用新的数据库版本也没有什么变化。

我认为这种看法是错误的,很肤浅的,井底之蛙


实际上新的语法对应了新的算法,对应了性能的提升。比如,sql 2000的时候分页要通过top+not in来实现,写法复杂,要嵌套好几层,效率很低,到了2005版本的时候新语法支持row_number,效率提升非常大,到了2012后支持了offset,性能提升更加稳定(后面会有具体的分析)。


1、把2个sql一起运行,先取第2页数据,看实际的执行计划以及查询开销百分比。

从下面的图可以看出,row_number方法占用了51%的开销,而offset方法占用了49%的开销,两者性能差不多。




2、但是进一步分析:

SET STATISTICS IO ON

SET STATISTICS TIME ON

发现row_number方法逻辑扫描5次,占用时间52毫秒,而offset 方法却占用了92毫秒,又说明row_number方法速度似乎更快。




3、取10000页。

从下图可以看出,2者的性能基本上一样,只是两者随着所取页数越来越靠后,速度有所放慢。



4、取400000页。

虽然逻辑读取次数一样,但是offset分页方法优于row_number方法,占用时间上少了近一半,cpu时间少了三分之二。



总结:

     从上面的分析可以看出,一开始在取第2页时速度很快,需要几十毫秒,当取第10000页时,需要100多毫秒,但当取第400000页的时候,offset的速度为1秒,而row_number的速度为2.6秒左右。

     虽然两种方法总体上,随着所取分页的偏移位置越来越大,总体速度是越来越慢,但是也可以看出offset方法的速度下降较慢,而row_number方法虽然一开始速度比offset快,但是之后的速度下降幅度较大,可以预见到随着所取分页的偏移越来越大,速度会加速下滑。

     由此看出offset分页方法的性能是更加稳定的。


原文地址:https://www.cnblogs.com/momogua/p/8304432.html