没有合适的资源?快使用搜索试试~ 我知道了~
首页Oracle数据库优化详解
Oracle数据库优化经典之作,全文集合了经验丰富的DBA对于Oracle数据库优化的真知灼见,让很多人受益匪浅,Oracle数据库自9i版本以后,10g,11g版本推荐使用CBO优化器,所以,本文主要结合一系列实例,详细讲解如何在CBO模式下进行Oracle数据库优化,其中主要包括收集数据库统计系统、收集列直方图、分析SQL执行计划、如何让CBO优化器选择最优的执行计划,以及如何使用Hint提示认为改变CBO优化器的执行计划等,希望此文档能够帮助大家更深入地理解Oracle优化!
资源详情
资源评论
资源推荐

Oracle
Oracle
Oracle
Oracle 数据库优化详解
第 1 页 共 63 页
目 录
1 引言 ....................................................................................................................................... 4
1.1 背景及目的 .............................................................................................................. 4
1.2 适用范围 .................................................................................................................. 4
1.3 术语和缩略语 ........................................................................................................... 4
2
CBO 开发规范 ....................................................................................................................... 5
2.1 数据分布不均的处理 ................................................................................................ 5
2.1.1 数据分布不均匀的定义 ...................................................................................... 5
2.1.2 加 hint 的方法 .................................................................................................... 6
2.1.3 得到详细执行计划的方法 .................................................................................. 7
2.2 含有 dblink 的视图的处理 ......................................................................................... 7
2.3 日期型数据的定义 .................................................................................................... 7
2.4 不允许在 where 条件中包含变量的判断条件 ............................................................. 7
2.5 日期型字段做范围查询 ............................................................................................. 8
2.6 查询条件中列值需要运算的处理 ............................................................................... 8
2.7 绑定变量避免带入 null 值 ......................................................................................... 8
2.8 SQL 书写通用规则 ................................................................................................... 8
3
附录一: CBO 优化案例分析 ............................................................................................... 10
3.1 案例背景 ................................................................................................................ 10
3.2 系统配置以及测试方法 ........................................................................................... 10
3.2.1 系统配置 ......................................................................................................... 10
3.2.2 SQL 调优思路 .................................................................................................. 11
3.2.3 测试方法 ......................................................................................................... 11
3.2.4 SQL 调优方法 .................................................................................................. 11
3.3 具体问题分析 ......................................................................................................... 14
3.3.1 案例一:数据分布不均匀 ................................................................................. 14
3.3.2 案例二:参与 JOIN 的表的个数超过了 5 个, CBO 选择的执行计划的效率不高 26
3.3.3 案例三:查询条件中的时间宽度过大 ............................................................... 26
3.3.4 案例四: SQL 的写法引起 SQL 在 CBO 环境下效率降低 ................................... 35
3.3.5 案例五:日期型数据定义成了字符型或数字型 ................................................. 39
3.4 总结 ....................................................................................................................... 41
4 附录二: CBO 基础 ............................................................................................................... 43
4.1 Oracle 的优化器( Optimizer ) ................................................................................. 43
4.1.1 RBO 方式 ........................................................................................................ 43
4.1.2 CBO 方式 ........................................................................................................ 44
4.2 CBO 中成本的概念及计算 ...................................................................................... 45
4.2.1 CBO COST 的概念 ........................................................................................... 45
4.2.2 CBO COST 的计算 ........................................................................................... 46
4.2.3 CBO 的选择性 ................................................................................................. 47
4.3 CBO 的统计信息及收集方法 ................................................................................... 50
4.3.1 如何查看对象的统计信息 ................................................................................. 50
4.3.2 如何收集统计信息 ........................................................................................... 52

Oracle
Oracle
Oracle
Oracle 数据库优化详解
第 2 页 共 63 页
4.3.3 收集统计信息的选项 ........................................................................................ 53
4.4 CBO 对没有统计信息对象的处理 ............................................................................ 54
4.5 直方图 (Histogram) .................................................................................................. 54
4.5.1 直方图的概念 .................................................................................................. 55
4.5.2 如何收集直方图 ............................................................................................... 56
4.5.3 直方图对选择性的影响 .................................................................................... 57
4.6 Clustering Factor ...................................................................................................... 58
4.7 表连接的方式 ......................................................................................................... 59
4.7.1 排序 - 合并连接 (Sort Merge Join, SMJ) ................................................................ 59
4.7.2 嵌套循环 (Nested Loops, NL) ............................................................................. 60
4.7.3 哈希连接 (Hash Join, HJ) ................................................................................... 61
4.7.4 各种连接方法的比较 ........................................................................................ 61
4.7.5 笛卡儿乘积 (Cartesian Product) .......................................................................... 62
4.8 为什么 CBO 选择错误的执行计划? ........................................................................ 62
4.8.1 什么是好的执行计划? .................................................................................... 62
4.8.2 CBO 选择不合理执行计划的常见原因 .............................................................. 62
4.8.3 调整优化器行为的一般性原则 .......................................................................... 62
4.9 Hint 的使用方法 ..................................................................................................... 63
4.9.1 Hint 的基本用法 .............................................................................................. 63
4.9.2 常用 Hint 的分类 .............................................................................................. 64
4.9.3 Hint 的注意事项 .............................................................................................. 65
4.10 参考书目 ................................................................................................................ 66

Oracle
Oracle
Oracle
Oracle 数据库优化详解
第 3 页 共 63 页
1 引言
1.1 背景及目的
Oracle 在 10 多年前的 1992 年,在 Oracle7 版中引入了基于成本的优化器( CBO ) 。而在此之
前 , 只有基于规则的优化器 (RBO) 可用 。 这么多年来 , CBO 得到了充分改进并支持 Oracle 所有
的新特性 。 而从 Oracle10g 开始 , 将不再支持 RBO , 所以所有使用老版本 Oracle 的产品的 RBO 模
式的数据库,在升级到 Oracle10g 版本时,都面临一个 Oracle 优化器从 RBO 升级到 CBO 的问题 。
本文的目的是通过总结从 Oralce8i RBO 升级到 Oracle10g CBO 的测试过程,提供从旧版的
RBO 数据库升通讯到 10g CBO 时的一个最佳实践 。 包括 Oracle CBO 的基本知识 、 从
8i
升级到 10g
的测试方法 、 分析测试过程中出现的所有典型问题的 SQL 问题 , 以及最终总结出适合基于 CBO
的开发规范。
1.2 适用范围
此文档预期读者是 DBA 及 开发人员 。
1.3 术语和缩略语
此处请填入文档中的专业术语及解释。
序号 术语 / 缩略语 全称和说明
1. CBO Cost-Based Optimizer, 基于成本的优化器
2. RBO Rule-Based Optimizer, 基于规则的优化器
3.
1.4 策略概述:
根据 ORACLE 研发部门的专家建议。建议使用以下统计值收集策略:
1 ) 不收集表的列值分布的直方图 。 以下所有的收集统计信息的说法都包括了 “ 不收集表的
列值分布的直方图 ” 的描述。
2 ) 禁止数据库系统自动收集用户的表和索引的统计信息。
3 ) 在 10g 升级之后立即对所有的表和索引进行一次统计值信息收集。对于有分区表的数据
库 , 建议对分区和子分区也收集统计值 。 以后不再定期对所有的表 、 索引进行统计信息
收集。
4 ) 对于那些列值的最大值不断增长的表列且要进行范围查询的 , 需要定期手工设定其最大
值或最小值。通常情况下列的类型为日期型或序列,定期的周期建议为一周。
5 ) 对于以下情况,采用的处理方式:
对于大批量操作,当表的 insert 记录数达到了一倍, update/delete 了表的总记录数的
50% , 需要重新收集统计信息 。 开发书写调用 DBA 提供的表 cascade 收集统计信息的
procedure 的收集统计信息脚本 , 并在开发环境测试 , 部署组或事件响应组在测试环
境测试 , 最后部署组或事件响应组在执行大批量操作之后执行重新收集统计信息的
脚本重新收集大批量操作的表及其索引的统计信息。
对于渐近变化,建议不需要重新收集统计信息

Oracle
Oracle
Oracle
Oracle 数据库优化详解
第 4 页 共 63 页
更改了表结构及或新建索引 , 需要重新收集表 cascade 统计信息 。 由部署组在每次版
本下发之后调用 DBA 提供的 procedure 对本次版本下发涉及到的修改了表结构或索
引结构的所有表或索引进行重新收集统计信息。
对于临时表 ( 经常清空再插入数据 ) ,在记录数相对最大时收集统计数据(一般为晚
上清空前数据量最大),然后锁定统计信息。
2 CBO 开发规范
下面的规范是总结 CBO 测试中所碰到的 SQL 问题得出的适用于开发部门参考的开发规范。
2.1 数据分布不均的处理
出现在 where 条件字段中的列 数据分布 不均匀 时 建议 通过测试验证其性能。对于因为条件字段的 数
据分布 不均匀 造成 sql 执行效率降低的 , 需要通过增加 hint 来解决 , 而不是通过收集直方图的方式
,
并且要求对于这种问题的 SQL 语句 , 需要在开发文档中记录该语句的详细执行计划 。 对于数据分布
不均匀对执行计划的影响的分析,请参考案例一的分析。
2.1.1 数据分布不均匀的定义
当查询条件中通过某个列的 单个条件过滤返回的记录数 偏离该 表的平均记录数 的 60% 时,认为是不
平均的( 60% 是根据 CBO 测试结果得出的统计值,其他业务系统需要适当调整)。
计算方法:
(a).
(a).
(a).
(a). 对于等值查询情况:
等值的查询意思是在条件中用到的是 “ = ” 号或者是 in(a,b,c … ) 的情况。
偏离平均值的比率( Re )
= ((实际值对应的记录数) - (平均分布时的记录数)) / (平均分布时的记录数)
= (实际值对应的记录数) / (平均分布时的记录数) - 1
= (实际返回的行数) / (非空的总记录数 * 选择性) - 1
= ( cardinality ) / ((num_rows – num_nulls) * selectivity) – 1
其中:
cardinality :通过表中单个列的过滤条件返回的行数
num_rows :表的总行数
num_nulls :列值为空的行数
selectivity :数据的选择性。即:满足过滤条件的概率。根据前面的计算 selectivity 的公式。每
个等值的 selectivity=1/num_distinct 。如果有 n 个 or 等值条件, selectivity=n/num_distinct (如果
条件为
in
, 那么可以看成 or ) 。 如果有 n 个 and 等值条件 , selectivity=(1/num_distinct) 的 n 次方 。
num_distinct :列的唯一值的个数
判断标准:
如果 |Re| > 60% ,则认为该列数据分布不均,可能对 CBO 的估计造成影响。
举例说明:

Oracle
Oracle
Oracle
Oracle 数据库优化详解
第 5 页 共 63 页
假设表 T1 的总记录数为 1000 ,表 T1 在 C1 列上的 distinct 值为 10 ,并且在 C1 列上没有 NULL 值
,
那么表在该列的每个列值 平均记录数 为 1000/10 = 100 。
假设 where 条件为: C1
in
( ‘ 1 ’ , ‘ 2 ’ ) ,相当于有两个 or 的等值条件。实际满足条件(即 C1 列值为 ’ 1 ’
和 ’ 2 ’ ) 的记录数为 60 。 而根据平均值 , 在均匀分布时两个条件返回的平均记录数应该为 2 × 100=200 。
那么偏离平均值的比例为: (60-200)/200 = -70% ,所以 C1 列上的值 ‘ 1 ’ 和 ‘ 2 ’ 是分布不均的。
(b).
(b).
(b).
(b). 对于范围查询情况:
范围查询是除了等值以外的情况,比如 > 、 < 或者 between … and … 等。
偏离平均值的比率( Rr )
= ((实际值对应的记录数) - (平均分布时的记录数)) / (平均分布时的记录数)
= (实际值对应的记录数) / (平均分布时的记录数) - 1
= (实际返回的行数) / (非空的总记录数 * 选择性) - 1
= ( cardinality ) / ((num_rows – num_nulls)* (VH-VL) / ( HIGH_VALUE - LOW_VALUE ) ) – 1
其中:
cardinality :通过表中单个列的过滤条件返回的行数
num_rows :表的总行数
num_nulls :列值为空的行数
VH
:范围查询中的高值,如果没有设置高值的开区间查询,其值等于 HIGH_VALUE
VL :范围查询中的低值,如果没有设置低值的开区间查询,其值等于 LOW_VALUE
HIGH_VALUE :记录中列值的最大值
LOW_VALUE :记录中列值的最小值
判断标准:
如果 |Rr| > 60% ,则认为该列数据分布不均,可能对 CBO 的估计造成影响。
举例说明:
假设表 T1 的总记录数为 1000 ,表 T1 在 C1 列上的 distinct 值为 10 ,最大值为 100 ,最小值为 0 。 并
且在 C1 列上没有 NULL 值。
假设 where 条件为 : C1 > ‘ 10 ’ and C1 < ‘ 40 ’ 。 实际满足条件 ( 即 C1 列值介于 ’ 10 ’ 和 ’ 40 ’ ) 的记录数 为
60 。而根据平均值,在均匀分布时该条件返回的平均记录数应该为 (40-10)/(100-0) × 1000=300 。
那么偏离平均值的比例为: (60-300)/300 = -80% ,所以 C1 列在 C1 > ‘ 10 ’ and C1 < ‘ 40 ’ 的条件下是分
布不均的。
2.1.2 加 hint 的方法
数据分布不均引起 CBO 选择执行计划不合理会体现在两个方面 , 一个是表连接顺序不对 , 这时需要
通过 LEADING hint 指定表连接顺序;另外一个是表的访问路径不对,这时需要指定 INDEX 或 者
FULL hint 。
剩余62页未读,继续阅读
















安全验证
文档复制为VIP权益,开通VIP直接复制

评论0