如果提高排序及表连接的效率

标签: 排序 | 发表时间:2012-12-17 20:32 | 作者:
出处:http://www.iteye.com

 

文章截自《品悟性能优化》。

 

一、排序介绍:

Oracle里面有哪些操作需要排序,或者有哪些操作是隐含进行排序的?

1.order by短语是当然要进行排序的.

2.其实还有distinct,Union等操作会隐藏进行排序.

      a.distinct是需要先排序相关字段,然后去掉重复记录.

      b.union和union all的区别是,前者的结果集也需要去掉两个查询语句的重复记录,所以需要排序.后者的结果集是所有记录,包括重复记录,所以不需要排序.如果两个结果集之间根本没有交集,当然使用union all而不是union.

 

二、Oracle表连接技术和应用.

1.数据库精髓之一:表连接.

2.最经典,最常用的表连接技术_嵌套循环.

      以举例方式,来形象、通俗地描述Oracle各种表连接技术。例如,如下语句,欲查询所有员工所在部门的所有情况:

select e.*,d.*
from emp e, dept d
where e.deptno = d.deptno;

      Oracle经典的嵌套循环(Nested_Loop)连接执行计划如下: 

       即先循环查询dept,再按dept每条记录去查询emp,找到dept对应部门的所有员工。 

       如果以图表示如下:

 

        也就是说Oracle是以两层循环方式实现两个表的连接和检索,其中dept表是外循环,emp表是内循环。

        那么我们把外循环表(dept)叫作外表或驱动表,内循环表(emp)叫作内表或被驱动表。

3.继续举例,如果要查询员工号为7499的员工信息和所在部门信息,语句如下:

select e.*,d.*
from emp e, dept d
where e.deptno = d.deptno
and e.empno=7499 ;

      为提高查询效率,Oracle应结合索引技术来实现上述操作。正确的查询方式应该是:先按照建立在empno字段上的索引去emp表查询empno为7499的员工信息,再根据7499所

在的部门号(deptno)去dept表查询该部门的详细信息,而且dept表的deptno字段上应该有索引。因此,这就是该语句的执行计划。

如果以图表示,如下:  

 

       所以单字段索引设计建议:如果是多表连接SQL语句,注意被驱动表(drived table)的连接字段是否需要创建索引。

       在上例中,被驱动表是dept,dept表连接字段是deptno。而emp的deptno字段是可以不需要建索引的。

       

 

继续举例,如果要查询员工号为7499的员工信息,并且部门在DALLAS的部门信息,语句如下:

select e.*,d.*
from emp e, dept d
where e.deptno = d.deptno
and e.empno = 7499 
and d.loc = 'DALLAS';

        正确的查询方式应该还是:先按照建立在empno字段上的索引去emp表查询empno为7499的员工信息,再根据7499所在部门号(deptno)去dept表查询该部门详细信息。此时

dept表还有一个条件:loc='DALLAS',因此可考虑按(deptno,loc)复合方式去查询dept表,效率更高,即可建立(deptno,loc)字段上的复合索引(idx_dept_2)。因此,这就

是该语句的执行计划: 

如果以图表示,如下: 



 

 

        复合索引设计建议:如果是多表连接SQL语句,注意是否可以在被驱动表(drived table)的连接字段与该表的其他约束条件字段上创建复合索引。

        在上例中,被驱动表是dept,dept表连接字段是deptno,而loc是其他约束条件,所以可以创建(deptno,loc)字段上的复合索引。而emp表的deptno字段是不需要建索引

的。

        需要进一步说明的是,为阐述在表连接中建立复合索引的重要性,作者故意将建立在deptno字段上的dept表的主键pk_dept先删除掉。因为有如下建议:如果单个字段是主

键或唯一字段,或者可选性非常高的字段,尽管约束条件字段比较固定,也不一定要建成复合索引,可建成单字段索引,降低复合索引开销。

        即在本例中,本来是不需要建立上述复合索引(idx_dept_2)的,只需要为dept表的loc字段建立单字段索引。

 

 

 

未完待续... ...

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [排序] 推荐:

堆排序

- kongshanzhanglao - 博客园-首页原创精华区
       堆排序是利用堆的性质进行的一种选择排序.   堆实际上是一棵完全二叉树,其任何一非叶节点满足性质:.   Key[i]<=key[2i+1]&&Key[i]<=key[2i+2]或者Key[i]>=Key[2i+1]&&key>=key[2i+2].   即任何一非叶节点的关键字不大于或者不小于其左右孩子节点的关键字.

排序算法

- - 互联网 - ITeye博客
排序算法有很多,所以在特定情景中使用哪一种算法很重要. 为了选择合适的算法,可以按照建议的顺序考虑以下标准: .     对于数据量较小的情形,(1)(2)差别不大,主要考虑(3);而对于数据量大的,(1)为首要.  一、冒泡(Bubble)排序——相邻交换 .  二、选择排序——每次最小/大排在相应的位置 .

lucene排序

- - 开源软件 - ITeye博客
排序是对于全文检索来言是一个必不可少的功能,在实际运用中,排序功能能在某些时候给我们带来很大的方便,比如在淘宝,京东等一些电商网站我们可能通过排序来快速找到价格最便宜的商品,或者通过排序来找到评论数最高或卖的最好的商品,再比如在Iteye里的博客栏里,每天都会以降序的方式,来显示出最新发出的几篇博客,有了排序,我们就能在某些时候很方便快速的得到某些有效信息,所以说排序功能,无处不在 ^_^.

【原】MapReduce的排序和二次排序

- - ITeye博客
自己学习排序和二次排序的知识整理如下. 1.Hadoop的序列化格式介绍:Writable. 2.Hadoop的key排序逻辑. 4.如何自定义自己的Writable类型. 1.Hadoop的序列化格式介绍:Writable. 要了解和编写MR实现排序必须要知道的第一个知识点就是Writable相关的接口和类,这些是HADOOP自己的序列化格式.

Java排序算法:归并排序

- - zzm
 Java排序算法(九):归并排序. 归并排序(Merge)是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的. 然后再把有序子序列合并为整体有序序列. 归 并排序是建立在归并操作上的一种有效的排序算法. 该算法是采用分治法(Divide and Conquer)的一个非常典型的应用.

排序大比武

- niko - C++博客-首页原创精华区
     摘要: 该比武只比速度,单线程测试随机正整数,不包括蜗牛排序,它弃权啦,哈哈. 操作系统:Windows XP Pro SP3,英文版编译器:g++4.5.2(-O3)CPU: Intel Core2 Q9500内存:DDR3普条 1066MHz, 4GB 插入排序、选择排序和冒泡排序最慢,时间复杂度为O(n2),希尔排序的速度依赖于使用的增量序列,堆排序、归并排序和改进的快速排序处于中等水平,时间复杂度...  阅读全文.

hadoop 二次排序

- - 企业架构 - ITeye博客
hadoop的工作流程:. 是在key中,排序value的实现,思路是. 1.把value中需要有序的部分value-part放入key中. 2.sortCompare类或key的CompareTo方法中完成对key+value-part的比较. 3.GroupingCompare中只对key进行比较,这样相同的key跌倒获取到reduce中.

排序算法 Sleep Sort

- Jeff - 酷壳 - CoolShell.cn
排序算法好像是程序员学习编程最多的算法,也可能是算法研究者们最喜欢研究的算法了. 排序有很多很多的算法,比如,冒泡,插入,选择,堆,快速,归并等等(你可以看看本站以前的那些文章:可视化的排序,排序算法比较,显示排序过程的python)这里向大家介绍一个“巨NB”的排序算法——Sleep Sort. 闲言少说,请看下面的代码(用Shell脚本写的).

“天才”排序算法:Sleepsort

- Sirius - 黑客志
4chan上某位神人发明的天才排序算法:Sleepsort,充分发挥多核威力,评论中还有更多优化版本:. TermKit: 下一代的Mac命令行/终端程序.

算法之美:排序

- Ashaum - 博客园-首页原创精华区
前段时间,我的一位钟情.net的童鞋在编写一套“教务管理系统”的时候,遇到了一个问题. 因为系统中包含学生的成绩排序,. 而大学英语作为公共课有非常多人考试. 这使得大学英语的成绩记录达到了二十多万行记录. 很多bug需要他处理,于是他就希望我能帮他解决这个问题. 在写代码之前我先看了下.net的sort方法.