SQL SERVER 2012 的分页方法创新版

关于SQL SERVER的分页方法,早在2004年,我就写了分页算法,现在这篇 :http://blog.csdn.net/fengyun14/article/details/143223 早已被网上传得漫天飞了。

SQL SERVER 2012新增了 Offset and Fetch 方法,写法如下:

select * from t order by 字段 offset 100 rows fetch next 20 rows only

语句要求必须写order by走索引,可是只要写order by 系统就会浪费CPU;然而我不需要再写明排序,因为我希望走索引的默认排序,那是不需明写排序的,那怎么办呢?只要写

select * from t order by (select 0) offset 100 rows fetch next 20 rows only

这样就可以不走排序了!

上面的这条语句是正常的写法,但执行效率会很低,改进的语句与此类似,但效率提高许多。

select * from t where id in (select id from t  order by (select 0) offset 100 rows fetch next 20 rows only)

当然oracle也可以写 select 0 from dual ; 但实际却没效果

上面这条语句等同于利用ROW_NUMBER的另外一种写法:

select * from  (select id from  (select top 120 id, ROW_NUMBER() over(order by (select 0)) AS ROWNUM FROM t) t1 where t1.ROWNUM>100 )

看了执行效率,用后面的这条row_number比fetch 还略好,为何呢?

单看纯粹的分页方法,他们的效率是一模一样的:

select id from t  order by (select 0) offset 100 rows fetch next 20 rows only

select id from (select top 120 id, ROW_NUMBER() over(order by (select 0)) AS ROWNUM FROM t) t1 where tt.ROWNUM>100)
但是加上相同的外套后,却变得截然不同,使用row_number的效率变得异常低,2条语句,用offset的开销占8%,用offset的开销占92%。看他们的I/O COST也一样,区别主要在于:Estimated Operator Cost,它的意思是:“用于执行此操作的查询优化器的开销。此操作的开销以占查询总开销的百分比的形式显示在括号中。由于查询引擎选择最高效的操作来执行查询或执行语句,因此此值应尽可能低。 ”所以,SQL SERVER认为这样的语句,它需要很长的时间来解释,无他。所以,我们在这种情况下,还是尽量用offset来分页吧。(解释见:http://www.51testing.com/html/03/n-817003-3.html)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值