CBO(Cost-based optimizer)是根据系统统计信息并以系统吞吐为最佳优化目标的Oracle优化方式。
边学边翻译,边翻译边体会..
通常情况下,CBO是缺省的
- 假如数据字典中包括至少一个待访问表的统计信息,那么优化器将选择基于成本的优化方式,以获取最大吞吐量的目标。
- 假如数据字典仅包含部分统计信息,仍将使用CBO方式,但是优化器不得不猜测那些没有任何统计信息的表的统计。这可能会导致次优化的执行计划。
- 假如数据字典没有包含任何待访问表的统计信息,优化器将选择RBO方式
以下是要必须使用CBO进行优化的内容
- 分区表和分区索引
- 索引组织表
- 翻转键索引
- Select 语句中的SAMPLE语法
- 并行查询和并行DML
- 星星转换和星星连接
- Etensible优化
- 物化视图的查询重写
- Enterprise Manager Progress Meter
- Hash连接
- 位图索引和位图join索引
- 跳索引扫描(Index Skip Scans)
CBO的组成
- 查询转换(Query Transformer)
- 评估(Estimator)
- 计划生成器(Plan Generator)
查询转换(Query Transformer)
查询转换器主要分析下面4种查询转换信息
Ø 视图合并(View Merging).
Ø 断言(Predicate Pushing)
Ø 非嵌套子查询(Subquery Unnesting)
Ø 物化视图的查询重写(Query Rewrite with Materialized Views)
评估(Estimator)
评估器产生下面三种类型的度量值
Ø 选择性(Selectivity)
选择性代表了一个记录集(基表,视图,Group By结果集)中的片断,选择性通常和一个查询断言进行绑定.一个断言的选择性表明了一个结果集的行数通过了断言测试.选择性的范围是从0.0到1.0,0.0的选择性表示在结果中没有记录被选择,1.0的选择性表示所有行被选中
Ø 基数(Cardinality)
基数表示一个行集中的行数.
基本基数 是一个基表的记录数,通过分析表(Analyze Table)能够被获取,评估器通过表的分区数(Extents)来估计基本基数
有效基数 是从基表中选择到的记录数,有效基数取决于断言的查询.
连接基数 是两个行集连接后产生的行集.
Distinct基数 是行集中某个字段的Distinct的行数.
Group基数 是分组后产生的行数
Ø 成本(Cost)
成本代表资源使用的单位,CBO使用I/O,CPU,内存做为工作单位.
计划生成器(Plan Generator)
主要功能是试图找出所有可能的不同的组合,并找到最低成本的执行计划
一个SQL执行计划和执行步骤
详细参看Oracle9i/Database Performance Tuning Guide and Reference
EXPLAIN PLAN FOR
SELECT e.employee_id, j.job_title, e.salary, d.department_name
FROM employees e, jobs j, departments d
WHERE e.employee_id < 103
AND e.job_id = j.job_id
AND e.department_id = d.department_id;
- 全表访问Employees行数据(Employee _ID<103太没有效率,故不走索引)
- 根据Employees行记录,通过唯一索引JOB_ID_PK扫描访问JOB表的JOB_ID字段
- 根据JOB_ID获取JOBS表的ROWID
- Employees表的结果集和Jobs表进行嵌套循环访问(1和3进行嵌套访问)
- 根据Employees行记录,通过唯一索引扫描访问Departments表的Department_ID字段
- 根据Department_ID获取ROWID
- 对6和4的结果集进行嵌套循环访问
- 返回记录集
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/6517/viewspace-145520/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/6517/viewspace-145520/