Oracle 优化相关

1、ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表 driving table)将被最先处理. 在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表.

2、ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前,那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾。

3、SELECT子句中避免使用 ‘ * ‘(ORACLE在解析的过程中, 会将'*' 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间)。

4、替换效率:in  --》 exists --》表连接

     in的常量列表是优化的(例如:aab019 in (‘20’,’30’)),不用exists替换;in列表相当于or

5、用EXISTS替换DISTINCT

 当提交一个包含一对多表信息(比如个人基本信息表和个人参保信息表)的查询时,避免在SELECT子句中使用DISTINCT.一般可以考虑用EXISTS替换 

 例如: 

低效: 

select distinct ac01.aac001

from ac02,ac01

where ac02.aac001 = ac01.aac001

and ac02.aae140='31'

and ac01.aab001='100100'; 

高效: 

select ac01.aac001

from ac01

where exists(select 1 from ac02 where aac001 = ac01.aac001

and aae140='31')

and ac01.aab001='100100';

6、尽量用union all替换union

Union会去掉重复的记录,会有排序的动作,会浪费时间。因此在没有重复记录的情况下或可以允许有重复记录的话,要尽量采用union all来关联。

7、使用DECODE函数来减少处理时间

使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表. 

例如:

(低效)

select count(1) from ac01 where aab001=’100001’and aac008=’1’; 

select count(1) from ac01 where aab001=’100001’and aac008=’2’;

(低效)

Select count(1),aac008

 From ac01

Where aab001=’100001’

  and aac008 in (’1’,’2’)

group by aac008;

(高效)

select count(decode(aac008,’1’,’1’,null)) zz,

count(decode(aac008,’2’,’1’,null))tx

from ac01

where aab001=’100001’;

特别说明:

group by和order by 都会影响性能,编程时尽量避免没有必要的分组和排序,或者通过其他的有效的编程办法去替换,比如上面的处理办法。

8、在使用left jion时,on和where条件的区别如下:

1、 on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。

2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。

因此左表的条件要放在为where后。

原文地址:https://www.cnblogs.com/doudingbest/p/7008565.html