Oracle数据库优化要点总结

当oracle出现性能缓慢、执行效率低下时,分析调优需从多个角度切入,并逐一优化:

1、SQL语句层面上
   A 注意语句中数据查询表的的顺序调整,大表在前(接近where)小表在后,若多个表关联情况下,应选择当中的关联表作为基表。
   B 语句中尽少使用函数或自定义,尽量避免group by 、having等字句。
   C 过于复杂的逻辑关系语句应分拆成多个sql。
   D 动态SQL时应积极使用绑定变量。(数据量越大,提高的效率越明显)
  

2、数据库优化器的使用
   A  建议尽量避免使用‘选择优化器(CHOOSE)’,而应使用成本(CBO)或规则(RULE)优化器。
   B  针对某些特定SQL可以使用HINT(提示)来指定使用优化器的类型;
       如: select /* +RULE */  from emp;


3、查询分析器(执行计划)及锁对象跟踪
  A 通过查询分析器(Trace) 或者 查询计划sql(1 EXPLAIN PLAN FOR <SQL> ; 2 SELECT * TABLE(XPLAN.display) )来查看执行计划(路径),
    找出消耗较大的几个位置,根据实际情况作调整。
  B 查看是否数据库存在锁对象,存在则酌情将锁对象解决掉。


4、索引使用
   A 对于经常需要全表扫描的数据表,则避免使用索引,这种情况下,索引的存在反而是增加消耗影响效率;
   B 在增删改操作较频繁的表也应该避免使用索引;这种情况下索引会增加15%左右 的消耗,大大的降低效率。
   C 在以查询为主的表中,全表扫描较少使用,的情况下则视实际情况在查询列上建立索引、组合索引、甚至反向索引。
   D 此外需要注意的是,索引列上出现函数或者运算符或空、like 等情况下,将会打破索引,因此在sql语句编写上需注意函数、运算、关键字的使用。


5、分区表
   A 在数据量庞大表时,需考虑分区存放,这涉及到无论是查询还是增删改都将会大大提高效率。
   B 至于使用范围分区、列表分区、散列分区(hash) 还是复合分区,这需要实际的情况而定,详见我另外博文《Oracle 分区简述》。


6、缓冲区(Database buffer cache)
   以上情况外,再者就是适当扩充数据缓冲区,以提高命中率(ratio)。

7、业务逻辑优化
   再后,其实也是最重要点,应考虑是否可在业务逻辑层面上作适当优化,所谓,聪明的懒人一向都是这样,先从高层面上去想问题。



猜你喜欢

转载自kelivenlin.iteye.com/blog/1702803