日期:2014-05-16  浏览次数:20372 次

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

?

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

?

一、排序介绍:

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字段建立单字段索引。

?

?

?

未完待续... ...

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?