ORACLE ORDER BY 索引

来源:互联网 发布:win10 kaiwifi软件 编辑:程序博客网 时间:2024/04/30 09:41

ORDER BY 通常会有两种实现方法,一个是利用有序索引自动实现,也就是说利用有序索引的有序性就不再另做排序操作了。另一个是把结果选好之后再排序。

用有序索引这种,当然是最快的,不过有一些限制条件,来看下面的测试。 17jquery.com

测试数据:student表有两个字段id ,sid ,id是主键。一共有20W条记录,id从1到200000,sid也是从1到200000的数据。

第一种情况 : 17jquery.com

一起jquery,17jquery

order by的字段不在where条件也不在select中

select sid from zhuyuehua.student where sid < 50000 order by id;


第二种情况 :

order by的字段不在where条件但在select中。 内容来自17jquery

17jquery.com

select id,sid from zhuyuehua.student where sid < 50000 order by id;


第三种情况 : 17jquery.com

内容来自17jquery

order by的字段在where条件但不在select中。

内容来自17jquery

select sid from zhuyuehua.student where sid < 50000 and id < 50000 order by id;


第四种情况 :

order by的字段在where条件但不在select中。倒序排列

select sid from zhuyuehua.student where sid < 50000 and id < 50000 order by id desc;


 17jquery.com

测试结果:

order by的字段不在where条件不在select中 有排序操作 17jquery.com

order by的字段不在where条件但在select中 有排序操作 内容来自17jquery

order by的字段在where条件但不在select中 无排序操作 17jquery.com

order by的字段在where条件但不在select中(倒序) 无排序操作

结论:

当order by 字段出现在where条件中时,才会利用索引而无需排序操作。其他情况,order by不会出现排序操作。

分析: 一起jquery,17jquery

内容来自17jquery

为什么只有order by 字段出现在where条件中时,才会利用该字段的索引而避免排序。这要说到数据库如何取到我们需要的数据了。

一条SQL实际上可以分为三步。 内容来自17jquery

1.得到数据

17jquery.com

2.处理数据 内容来自17jquery

3.返回处理后的数据

比如上面的这条语句select sid from zhuyuehua.student where sid < 50000 and id < 50000 order by id desc 内容来自17jquery

第一步:根据where条件和统计信息生成执行计划,得到数据。

第二步:将得到的数据排序。

当执行处理数据(order by)时,数据库会先查看第一步的执行计划,看order by 的字段是否在执行计划中利用了索引。如果是,则可以利用索引顺序而直接取得已经排好序的数据。如果不是,则排序操作。

第三步:返回排序后的数据。 一起jquery,17jquery

另外:

上面的5万的数据sort只用了25ms,也许大家觉得sort不怎么占用资源。可是,由于上面的表的数据是有序的,所以排序花费的时间较少。如果 是个比较无序的表,sort时间就会增加很多了。另外排序操作一般都是在内存里进行的,对于数据库来说是一种CPU的消耗,由于现在CPU的性能增强,对 于普通的几十条或上百条记录排序对系统的影响也不会很大。但是当你的记录集增加到上百万条以上时,你需要注意是否一定要这么做了,大记录集排序不仅增加了 CPU开销,而且可能会由于内存不足发生硬盘排序的现象,当发生硬盘排序时性能会急剧下降。

注:ORACLE或者DB2都有一个空间来供SORT操作使用(上面所说的内存排序),如ORACLE中是用户全局区(UGA),里面有SORT_AREA_SIZE等参数的设置。如果当排序的数据量大时,就会出现排序溢出(硬盘排序),这时的性能就会降低很多了。

内容来自17jquery

总结:

当order by 中的字段出现在where条件中时,才会利用索引而不排序,更准确的说,order by 中的字段在执行计划中利用了索引时,不用排序操作。

这个结论不仅对order by有效,对其他需要排序的操作也有效。比如group by 、union 、distinct等。


转自:http://www.17jquery.com/oracle/27011/

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 被医院骗了应该怎么办 四维胎儿不配合怎么办 孕甲状腺tsh有点偏高怎么办 20岁得胃癌了怎么办 洗鼻涕耳朵堵了怎么办 胡振兴预约不上怎么办 玻尿酸打歪了怎么办 隆鼻后鼻子胀疼怎么办 鼻子做的太高了怎么办 感觉被医院骗了怎么办 中风后嘴巴歪了怎么办 孩子中风嘴歪了怎么办 胃疼怎么办简单的偏方 胃痛怎么办简单有效的方法 急用5000元怎么办又没信用卡 我真的不想活了怎么办 不想活了怎么办很累 毕业推荐表丢了怎么办 想去英国留学该怎么办 三个人跟团住宿怎么办 跟团被强制消费怎么办 苹果6s手机黑屏怎么办 胸闷喘不过气来怎么办 经常胸闷气短呼吸困难怎么办 沙漠玫瑰根软了怎么办 誉峰国际的业主怎么办 20岁头发一直掉怎么办 考研报名点满了怎么办 便池堵了怎么办最简单 在皇城老妈生病怎么办 智齿烂了很痛怎么办 苹果4id密码忘了怎么办 前海医院出院后怎么办 拔完智齿脸肿了怎么办 补牙的材料掉了怎么办 医院预约号满了怎么办 华西医院卡掉了怎么办 体检前喝了水怎么办 咳嗽咳的想吐怎么办 做b超吃饭了怎么办 严重警告过了1年怎么办