oracle性能优化(一)
介绍具体操作前,先谈谈方法论问题。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)
- 查看执行计划时,如果有索引,在我们的sql中没用到索引,首先确认这几个方面。
索引列是否使用函数
- 索引列是否使用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的时候)才走索引。