oracle性能优化(一)

浏览: 1260

介绍具体操作前,先谈谈方法论问题。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的时候)才走索引。 
      
  3.     确认以上均没有问题,使用Hint强制索引或者并发。实在不行,重建索引。 (并发需要考虑多少并发合适)
  4.     ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其它WHERE条件之前,那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾。
  5.     多用commit语句。
  6.   使用CBO 时,要注意看采用了哪种类型的表连接方式。ORACLE的共有Sort Merge Join(SMJ)、Hash Join(HJ)和Nested Loop Join(NL)。CBO有时会偏重于SMJ 和 HJ,但在OLTP 系统中,NL 一般会更好,因为它高效的使用了索引。在两张表连接,且内表的目标列上建有索引时,只有Nested Loop才能有效地利用到该索引。SMJ即使相关列上建有索引,最多只能因索引的存在,避免数据排序过程。HJ由于须做HASH运算,索引的存在对数据查询速度几乎没有影响。
推荐 0
本文由 doudou1 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册