关于一条SQL的优化

  1. 对于写一条查询最大值和最小值的sql语句,我想大家肯定都是信手拈来

例如:select max( xx ),min( xx ) from table tab

但是你知道这条sql还能继续优化吗,当然我指的不是语句上的优美,而是性能上的优化

2.首先先创建一个表 t ,并初始化一组数值,在id列建索引

输入图片说明

输入图片说明

输入图片说明

初始化工作就完成了,首先查询一次最大值(自行测试的时候,都要把sql多执行2次.因为索引中存在缓存原理)

![输入图片说明](https://static.oschina.net/uploads/img/201710/13155246_cnkG.png "在这里输入图片标题")

可以看到 ORACLE使用的扫描器 是 INDEX FULL SCAN (MAX/MIN) 其中逻辑的执行了2次

查询最小值和上面的类似 就不贴图了,那一起查询最大值和最小值会不会就是简单的(2+2 =4)4次逻辑读了呢,

输入图片说明

结果往往就是这样的出乎意料 可以看出来 扫描器变成了 INDEX FAST FULL SCAN 逻辑读也变成了251个 至于出现这样的原因就是因为oracle 本身索引的结构造成的 最大值和最小值分别存在索引的开头和结尾,但是没有同时取到这两个值的扫描器 所以只能全局扫描了,那么有什么方法来解决这中情况呢

输入图片说明

输入图片说明

逻辑读 consistent gets 真的变成4 了 至此这条sql应该算是优化了

```select max,min from(select min(id) min from t) a ,(select max(id) max from t) b```

大家也可以动手试试 文中观点是我最近读书的收获,如有错误请指出

转载于:https://my.oschina.net/123qwe321/blog/1550358

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值