Oracle分页查询详解(四)

下面继续看查询的第三种情况,即内部循环包含排序的情况:

    准备工作如下:


    下面进行测试包含排序操作的分页查询。可以简单的将查询分为两种不同情况,第一种排序列就是索引列,这种可以利用索引读取,第二种排序列没有索引。

第一种情况又可以细分为:完全索引扫描和通过索引扫描定位到表记录两种情况。

无论是那种情况,都可以通过索引的全扫描来避免排序的产生。看下面的例子:


    这种情况下,通过索引可以完全得到查询的结果,因此可以避免表扫描的产生。


    由于不能仅仅通过索引扫描得到查询结果,这里Oracle选择了表扫描。这是由于初始化参数设置决定的。因此,建议在分页的时候使用FIRST_ROWS提示。


    使用了FIRST_ROWS提示后,Oracle不需要扫描全表,而且避免了排序操作。

下面讨论最后一种情况,排序列不是索引列。这个时候排序不可避免,但是利用给出分页格式,Oracle不会对所有数据进行排序,而是只排序前N条记录。




    观察两种不同写法的ORDER BY步骤,一个是带STOPKEYORDER BY,另一个不带。对于第一个查询语句来说,进行的数据的全排序,排序数据量大,排序操作不得不在磁盘上完成,因此耗时比较多;而对于第二个查询语句,Oracle利用了ORDER BY STOPKEY方式进行排序,排序操作只排序需要的TOP N的数据,因此排序操作放到了内存中。因此在大数据量需要排序的情况下,带STOPKEY的效率要比不带STOPKEY排序的效率高得多。

通过上面的例子可以看出给出的标准分页查询格式,对于包含排序的操作仍然可以在很大程度上提高分页查询性能。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值