zoukankan      html  css  js  c++  java
  • 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后。

  • 相关阅读:
    Django项目总结:Model高级
    Django项目总结:Response和Cookie
    数据库:索引
    数据库:视图
    数据库:约束
    MySQL:常用命令
    MySQL:安装和连接
    时间戳和正则表达式
    Java 类的概念与使用
    JAVA复习题
  • 原文地址:https://www.cnblogs.com/doudingbest/p/7008565.html
Copyright © 2011-2022 走看看