3.2.3 可用CBO模式 CBO有两种运行模式:ALL_ROWS和FIRST_ROWS. FIRST_ROWS的目标是尽可能最快的返回行.这种模式告诉优化器响应时间是最重要的。
3.2.3 可用CBO模式 CBO有两种运行模式:ALL_ROWS和FIRST_ROWS.
FIRST_ROWS的目标是尽可能最快的返回行.这种模式告诉优化器响应时间是最重要的。它偏好嵌套连接方式. FIRST_ROWS也以考虑成本为主要规则来处理行.通常规则是使用索引的计划而不是使用全表扫描的计划作为访问路径,ORDER BY子句导致索引访问,等等
从9i版本起,在First提示中行的数量可以在参数中设置,FRIST_ROWS_N(N可以是1,10,100 或者1000),随不同应用程序的需求而设置
ALL_ROWS在返回输出结果以前,对给定的查询处理所有的行。它迫使优化器考虑最少的资源占用和最佳的吞吐量. ALL_ROWS更喜欢排序合并操作
对于一个OLTP系统, FIRST_ROWS对于快速响应时间是一个理想的选项.
对于批处理方向的应用程序意味着使用ALL_ROWS.注意,以最快响应时间的返回第N行的计划可能不是一个理想的计划,如果系统需求获得完整的结果.因此应根据应用程序的需要而决定.
当数据库大小变化时CBO动态调整它的执行路径,因此如果对于同一个应用程序同样的查询,一个数据库设置中运行很好而在另外的数据库中运行不良,你不必要理会.如果在两个数据库中设置和统计资料不同,这个将会发生..为了防止出现这种情况.得考虑使用优化器持久性.稍后章节将会提到.
3.2.4 CBO基初术语 当CBO分析语句时,下列术语将会频繁使用
Cost(成本)
在CBO中,成本的计算是涉及到每一个操作单位。逻辑上花费多少成本实际上并没有文档化或向外界公布,甚至随版本的不同而发生变化.
Cardinality(基数)
索引中单一行的数量和表中行的数量.查询基数是希望返回行的数量.
Selectivity(选择性)
单一值的数量,被索引列的单一值视为选择性.举例来说,如果一个表有10000行,已创建的一个索引在一个列中有4000单一值,那么索引的可选择性为4000/10000*100=40%,在不为空的列上唯一索引的可选择性为100%.
Transitivity(传递性)
对于查询,CBO生成额外谓词的处理.它使优化器能考虑额外的执行路径。举例来说,如果在查询中提供了A=B AND B=C的谓词,优化器可能会添加额外的谓词来暗示A=C.
Statistics(统计资料)
对于各种不同的数据收集许多必须的信息以支持对象..对于CBO执行计划来说,它是至关重要的。
Join Methods(连接方法)
Oracle用诸如哈希,合并排序和嵌套连接进行连接.一个查询可能运行的更快相比较其它的其它方法。对于单个的查询应该评估连接方法。
FTS(全表扫描)
全表扫描涉及到查询,从第一块到最后分配的块扫描。对于大表是极其昂贵的,应该避免。
Index scan(索引扫描)
涉及到通过使用表上一个或更多的索引,一个表上的随机访问.
查看本文来源
3.2.3最低要求 用CBO的最低要求是设置优化器模式为FRIST_ROWS或者ALL_ROWS(或CHOOSE)并为对象生成统计资料。然而,这并不能保证你的系统能工作到最佳状态。参照第二部分(初始化参数)涉及初始化参数的信息.
不管是否设置优化器模式。如果有以下情况之一,CBO将会自动调用:
1.用到提示.
2.用到分区表.
3.设置并行表
3.2.4为什么要移去RBO? Oracle 9i第二版将是最后一个正式支持CBO的版本。 Oracle推荐所有合作伙伴和客户验证使用CBO的应用程序,尽管RBO在Oracle10i(现在称Oracle10G)仍然可用,但不受支持。
作为每一个已发布的Oracle笔记中,RBO的存在妨碍了Oralce对查询处理引擎的关键增强.它的移除将允许Oracle提高数据库引擎查询处理组件的性能和可靠性。
目前,Oracle 对RBO的支持仅仅用以有限的错误修正并且Oracle对RBO没有添加新的功能.
3.2.5 为什么移至CBO? CBO主要获益如下:
1.以后Oracle停止RBO环境的开发.
2.随后的Oracle数据库将移除RBO
3.同CBO相比,RBO的访问方法是有限数量的.
4.所有新功能基于CBO,这些大多数新功能对于设置等等是重要的。簇索引表,位图索引,基于函数的索引,反向索引,哈希连接,物化视图,索引表,和并行查询, 星型连接等
5.媒介链接支持.
6.一旦RBO不受支持,Oracle支持也不可用。
7.CBO已经成熟
先前Oracle7中,RBO在某些场景胜过CBO,甚至CBO并不是如想像中完好,并且经常选择糟糕的执行计划。以后的发行版本中,CBO功能获得了提升,现在对于新功能,它提供了对考虑收益的较好交互性
8.分布式和远程查询更加可靠
在RBO中,数据库链接,从本地到远程数据库多于一个表的查询调整相当困难.同样的工作,CBO胜过了RBO。本地优化器知道远程表的目前统计信息,并且对于执行计划能做出更好的决定.RBO可能考虑远程数据库的索引,但是CBO有权利统计远程数据库索引的信息并对查询计划做出决定.
查看本文来源
系列之二包含影响优化器选择执行计划的初始化参数和Oracle内部隐藏参数,合理设置这些参数对于优化器是相当重要的。
6.影响优化器的初始化参数
除了生成统计资料之外,下面提及的参数设置在你的系统正常工作中扮演着极重要的角色.这些设置将大多依赖于你想创建何种类型的环境。联机,批处理,数据仓库或多于一个的组合。请注意优化器考虑这些参数以评估每一个在CBO生成的执行计划.
在下面例子中提及的参数值是这样的(它已在Oracle8.1.7.4中一些联机事务处理运行结果良好),Oracle给你决定想维护何种设置的自由.因此不要仅保持默认值并且确信对于每个需求设置这些参数.
6.1) OPTIMIZER_MODE
此项决定优化器引擎运行在何种模式下。有效值:RULE, CHOOSE, ALL_ROWS, FIRST_ROWS (_n).已在第一部分3.2.2解释CBO选项.
可将OPTIMIZER_MODE设置为CHOOSE.这种中间类型的选项在RBO和CBO之间,
事实上,它试着在统计资料是否可用的情况下运行查询在CBO或RBO模式下。因此,如果出现在查询的表已生成统计资料,Oracle将优先采用CBO (ALL_ROWS only)
例子: optimizer_mode = first_rows
6.2) OPTIMIZER_FEATURES_ENABLE
此项用来设置诸如8.1.5, 8.1.7, 9.0.0.的版本号。因为在每一个版本中CBO增加了新功能,它会改变并导致不同的执行计划。可以为你的程序调整设置版本号。请注意设置较低的版本将会防止以后版本新功能的使用。
例子: optimizer_features_enable = 8.1.7
6.3) OPTIMIZER_MAX_PERMUTATIONS
此项参数指定查询连接的最大排列数量以选择一个执行计划,它会影响查询的解析时间,应该设置一个较低的值。确保本节提及的另一个参数的正常设置以致于优化器在指定的上限内查找到一个最佳的执行计划。Oracle8中默认值为80000,意味着没有限制。Oracle9中默认值为2000.
例子: optimizer_max_permutations = 2000
另一参数OPTIMIZER_SEARCH_LIMIT覆盖了本参数的效果,它指定一个查询中最大的表数量,可以考虑排序笛卡尔连接。在Oracle8.1.6中已废弃.
查看本文来源