ORACLE 提供了基于成本(CostBased)和基于规则(RuleBased)两种优化器,简称为CBO和RBO,用于确定查询操作的执行计划。
一、如何使用CostBased优化器优化查询操作?
如何使用CBO,那么首先要理解这些概念
1、CBO的成本计算的依据
(1)统计信息:与SQL语句所引用的对象相关以及主机的CPU和IO
(2)SQL语句本身
(3).环境:例如与优化器相关的参数设置
2、优化器目标:optimizer_mode
(1)ALL_ROWS
(2)FIRST_ROWS_N
3、选择率和基数
4、聚簇因子
5、查询转换
(1)视图合并(view merge)
(2)谓词推进(Predicate Pushing)
(3)子查询非嵌套化(Subquery Unnesting)
(4)OR条件展开
6、绑定变量与直方图
7、收集统计信息
二、为什么CostBased优化器的执行计划不是最好的?
CostBased优化器本身也是个智能软件,肯定有陷缺,RBO(Rule-Based Optimizer)可以在某种程度上弥补CBO在性能上的缺陷。
三、为什么CostBased的查询有时候性能很好,有时候却突然的变慢呢?
1、有可能是以下原因
(1)统计信息不正确,这是关键所在
查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/database/Oracle/
(2)与优化器相关的参数设置的不太合理,如下参数
optimizer_features_enable
optimizer_index_caching
optimizer_index_cost_adj
optimizer_mode
db_{keep_|recycle_|nk_}cache_size
db_block_size
db_file_multiblock_read_count
hash_area_size
memory_target
parallel_threads_per_cpu
pga_aggregate_target
sort_area_size
sga_target
(3)sql语句的编写
例如一个复杂的sql有几十张表相连,CBO就不一定能正确连接表的顺序了,这时需要用Hint固定顺序。。。
2、用以下方法改变执行计划
(1)修改sql本身,如用Hints提示等
(2)稳固计划
(3)使用sql概要(sqlprofile)
(4)改变统计信息
(5)设置优化器模式相关的参数
(6)使用基线(baseline)