介绍具体操作前,先谈谈方法论问题。oracle 9i以后的版本,都是基于CBO(基于成本的执行计划优化) .

Rule Based Optimizer(RBO)基于规则
Cost Based Optimizer(CBO)基于成本,或者讲统计信息

 

下面的一系列文章将讨论关于oracle性能优化的问题,oracle sql过慢一般存在方法论:

   首先查看oracle的执行计划,执行计划包括一些参数,在此我一般只关注cost以及opration两个参数。  

oracle的执行计划的查看方式:

  • 查看执行计划有好多方式,比如使用PL/SQL Developer工具,选中select语句,按F5键就可以显示其执行计划,不过显示的不完全。
  •  最好使用在Oracle官方的sqlplus工具,性能最好,方便直观,下面介绍两种查看执行计划方式(也是最简单的两种方式 explain plan for 语句以及set autotrace trace)
  1.      查看执行计划时,如果有索引,在我们的sql中没用到索引,首先确认这几个方面。
  2.                  索引列是否使用函数

  •         索引列是否使用not 或者!=
  •        索引列是否使用like \’%add\’ ,百分号在前面
  •        where条件选出来数据太多,导致CBO认为走全表扫描代价更低
  •         是否有对索引列数据隐形转换
  •         单独引用复合索引里非第一位置的索引列. 
  •          使用not in 或者not exists
  •         表状态更新(使用ANALYZE 命令)
  •          B-tree索引 is null不会走,is not null会走,位图索引 is null,is not null 都会走 ,联合索引 is not null 只要在建立的索引列(不分先后)都会走, is null时 必须要和建立索引第一列一起使用,当建立索引第一位置条件是is null 时, 其他建立索引的列可以是is null(但必须在所有列 都满足is null的时候)才走索引。 

  

  •     确认以上均没有问题,使用Hint强制索引或者并发。实在不行,重建索引。 (并发需要考虑多少并发合适)
  •     ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其它WHERE条件之前,那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾。
  •     多用commit语句。
  •   使用CBO 时,要注意看采用了哪种类型的表连接方式。ORACLE的共有Sort Merge Join(SMJ)、Hash Join(HJ)和Nested Loop Join(NL)。CBO有时会偏重于SMJ 和 HJ,但在OLTP 系统中,NL 一般会更好,因为它高效的使用了索引。在两张表连接,且内表的目标列上建有索引时,只有Nested Loop才能有效地利用到该索引。SMJ即使相关列上建有索引,最多只能因索引的存在,避免数据排序过程。HJ由于须做HASH运算,索引的存在对数据查询速度几乎没有影响。
  •       

     

    版权声明:本文为doudou1原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
    本文链接:https://www.cnblogs.com/doudou1/p/5315519.html