oracle优化器学习

      Oracle在执行一个SQL之前,首先要分析一下语句的执行计划,然后再按执行计划去执行。分析语句的执行计划的工作是由优化器(Optimizer)来完成的。不同的情况,一条SQL可能有多种执行计划,但在某一时点,一定只有一种执行计划是最优的,花费时间是最少的(说白了,就是开销最小的)。一般大家用Pl/sql Developer、Toad等工具去看一个语句的执行计划,不过你可能对Rule、Choose、First rows、All rows这几项有疑问,因为我当初也是这样的,那时我也迷惑为什么选了以上的不同的项,执行计划就变了?
    优化器的优化方式有两种:基于规则(RBO)和基于代价(CBO)
1、RBO方式:就是oracle分析sql语句时,遵循的是oracle内部的一些规则。比如一般情况下查询语句中有索引是走索引。
2、CBO方式:就是开销(代价),主要是说用了多少cpu和内存,优化器在判断是否使用这种方法时,主要参照表和索引的统计信息(统计信息:给出表的大小,多少行,每行的长度,这些统计信息起初是没有的,在做analyze时才有的,很多时候这些统计信息会使优化器做出错误的判断,从而做出错误的执行计划,因此我门应该即使更新这些信息)
    在这里,大家要明白索引不一定就最优的,比如小表,只有几行数据,一次i/o就可以完成表的检索;而走索引却要两次I/O,所以在这里我们做full-scan是最优的。
       优化器的优化模式有4种:rule、choose、frist rows、all rows
分别说一下这四个概念:
1、rule:就是走基于规则的方式
2、choose:oracle默认的就是这个方式,这是说当一个表或索引有统计信息时,就采用cbo的方式;如果没有统计信息,表又不小,而且相应的列又有索引时,那么肯定走索引,就是上面说的RBO
3、First rows:他与第二种choose方式基本相同,不同的是当一个表有统计信息时,他将以最快的方式返回查询最先的几行,从总体上减少了响应时间。
4、all rows:这个模式就是我门所说的开销方式,当一个表有统计信息时,他以最快的方式返回所有的行,从总体上提高查询的吞吐量,没有统计信息则走基于规则的方式。
前面我学习了优化器的优化模式,下面我接着总结如何选择优化模式
1、instance级别
我们去找initdw.ora(我看的资料上说的是init(sid).ora)文件中设定(window中)
#***********************************************************************
# Optimizer and query parameters
#***********************************************************************
# All data warehouses should use the cost-based optimizer. All basic
# data warehouse performance features, such as star-query support,
# hash joins, parallel execution, and bitmap indexes are only
# accessible via the cost-based optimizer.
optimizer_mode = choose
# When using a star schema, set this parameter to true.
star_transformation_enabled = true
可以设置
optimizer_mode = RULE、optimizer_mode = CHOOSE、optimizer_mode = FIRST_ROWS、optimizer_mode = ALL_ROWS
oracle默认是optimizer_mode=choose
2、sessions级别
直接用命令修改
alter session set optimizer_mode=<mode>
3、语句级别
这里需要用到hint
前面讲了优化器怎么使用,现在接着总结一些常见问题
有时候有一个字段明明有索引,当我们观测sql一些语句时发现执行计划不走索引?
为什么呢?
不做索引大概有一下几个原因:
1、在instance级别用了all_rows的优化模式
2、你表的统计信息
3、你的表很小, oracle优化器他认为不值得走索引
解决方法:
1、修改initdw.ora(init(sid).ora)中的optimier_mode这个参数,把他改为rule或者choose,重启数据库,或者用前面所说的hint
2、删除统计信息
analyze table table_name delete statistics;
3、表小不走索引,是正常的,不用调。

你可能感兴趣的:(oracle,sql,优化,performance,transformation,statistics)