ORACLE ORDER BY 索引-程序员宅基地

技术标签: orcal  

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/

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/wq105032007067/article/details/11081479

智能推荐

tensorflow使用sparse_to_dense方法出现 indices is out of bounds的错误_indices are out-of-bounds-程序员宅基地

tf.sparse_to_dense()方法有时会出现indices out of bounds的情况,比如:import tensorflow as tf# 假设数据标签有3类label = tf.expand_dims(tf.constant([1, 2, 2, 3, 3]), 1)index = tf.expand_dims(tf.range(5), 1)conact = tf.c..._indices are out-of-bounds

C#实现继电器控制(触发灯开,灯灭,以及灯闪)_c#开关灯窗口程序-程序员宅基地

首先明白串口继电器协议(0x24协议),发送的指令要求格式一般帧头(1 字节)、地址(1 字节)、命令长度(1 字节)、命令(1 字节)、参数码(N 字节)、校验(1 字节)波特率:9600,校验位:N,数据位:8,停止位:1其次确定控制灯开灯灭那么必先实现硬件软件对接,涉及串口通信,获取通信端口,并打开C# serialPort类用于打开串口先看看serialPor..._c#开关灯窗口程序

html中写几个li标签,ul标签和li标签 li标签里面能嵌套UL标签吗?_复古国家的博客-程序员宅基地

html中的li和ul是什么标签ul li 是一个组合:是无序列表标签,在实际中用的非常多, 与之对应的是有序列表:ol li 一个无序列表: 咖啡 茶 牛奶 咖啡 牛奶 茶 咖啡 牛奶 茶html中的li和ul是什么标签?ul 是无序列表 。内含列表项 li 如: 列表1 列表2 列表3 UL 是没有排序的 。相对的有序列表就是OL。 一般网页都只使用无序列表。html里的ul和Li的区别是什么..._一个ul标签中包含几个li标签

给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。_客户给了一个升序正整数数组nums和一个正整数target,并给出了该数组的长度length,-程序员宅基地

给定一个按照升序排列的整数数组nums,和一个目标值target。找出给定目标值在数组中的开始位置和结束位置。你的算法时间复杂度必须是O(logn) 级别。如果数组中不存在目标值,返回[-1, -1]。示例 1:输入: nums = [5,7,7,8,8,10], target = 8输出: [3,4]示例2:输入: nums = [5,7,7,8,8,10], target = 6输出: [-1,-1]classSolution{publi..._客户给了一个升序正整数数组nums和一个正整数target,并给出了该数组的长度length,

thinkphp 表单令牌使用-程序员宅基地

(适用于thinkphp3.2,能在下图中找到红线文件)一、配置文件在conf文件夹下配置两个文件1)config.php <?phpreturn array( 'TOKEN_ON' => true, // 是否开启令牌验证 默认关闭 'TOKEN_NAME' => '__hash__', // 令牌验证的表单隐藏字</div>

(Hanoi)汉诺塔java实现程序_汉诺塔算法eclipse实现-程序员宅基地

汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。 图片来源:http://caterpillar.onlyfun.net/Gossip/Algo_汉诺塔算法eclipse实现

随便推点

Linux下c语言快速实现web服务器-程序员宅基地

1. 前言 最近整理了整理,把之前好玩的东西翻一下,这期就到了http了。 如何快速写一个http服务器?方法当然五花八门了,python、go几行就能实现出来了,那么c\c++如何实现呢?2. 相关接口libevent内置了http相关的处理方法(之前早期版本会有一些不稳定,现在event2比较靠谱了),同时支持

数据结构:数组、链表、栈、队列、堆_a. 栈 b. 队列 c. 堆 d. 链表-程序员宅基地

https://www.cnblogs.com/jimoer/p/8783604.html解释定义数据结构:数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。再简单描述一下:数据结构就是描述对象间逻辑关系的学科。如果还是不太清楚下面会举例说明的。数据存储结构:简单的讲就是数据在计算机中的存储方式。常用的数据存储方式有两种:顺序存储,非顺序存储。顺序存储就是把数据存储在一块联系的存储介质(硬盘或内存等)中。反之就是非顺序存储咯。Java中的数组就是典型的顺序存储,链表就是非顺序存储。数_a. 栈 b. 队列 c. 堆 d. 链表

软件测试入门到精通(30天学会软件测试)_软件测试_一周时间从入门到精通_love9599的博客-程序员宅基地

一、软件测试的概念和理论软件测试的目的 测试的目的是为了找到软件/网站存在的问题和缺陷 通过提前找到软件存在问题,可以降低商业风险。 软件测试的定义 软件测试就是用人工或者自动化对软件系统进行测试,通过测试需要找到预期结果和实际结果的差异 预期结果:在测试之前我们就知道的结果/希望出现的结果 实际结果:测试之后得到的实际结果 1.1、软件测试的基本原则 1、所有软件只能证明存在问题,不能证明不存在问题。 所有的软件的都是有问题的,只是这些问题是_软件测试_一周时间从入门到精通

tomcat启动maven项目报错 提示:java.util.concurrent.executionexception:org.apache.catalina.lifecyleexception:_maven.server.cannotstartserverexception java.util.-程序员宅基地

tomcat启动maven项目报错 提示:java.util.concurrent.executionexception:org.apache.catalina.lifecyleexception:错误如图提示:解决办法:右键项目---properties---deployment assembly -----add---选择java build path entries添加..._maven.server.cannotstartserverexception java.util.concurrent.ex

C#代码连接Oracle数据库一段时间以后[connection lost contact]的问题-程序员宅基地

最近在使用C#代码连接Oracle数据库,分为两部分,WCF的客户端与服务端。程序启动与运行都没有问题,部署到服务器上后,运行也没有问题。但是第二天再访问的时候,就会抛出下边所示的异常。这是怎么回事?Oracle.DataAccess.Client.OracleException ORA-03135: connection lost contact Process ID: 22574...

5G NR的调制方式与解调算法-程序员宅基地

【声明】:本文为原创文章,发表于wingsofsilence的程序员宅基地。欢迎转载,但请务必保留本信息,注明文章出处。 本文作者: wingsofsilence 本文原始地址:http://blog.csdn.net/wingsofsilence/article/details/78954315前言从物理层接收机来看,整个链路大致可以分为5部分:每个部分内容各有奥妙。先从较为容易入手的解调开始。..._nr的调制方式