- 对于写一条查询最大值和最小值的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```
大家也可以动手试试 文中观点是我最近读书的收获,如有错误请指出