
3)外链接谓语传递
比如原目标 SQL 中的谓语条件是“t1.c1=t2.c1(+) and t1.c1=10”,则 CBO 可能会给谓语条件额外加上“t2.c1(+)=10”。
4、CBO 的局限性
1)CBO 会默认目标 SQL 语句 where 条件中出现的各个列之间出现是独立的,没有任何关联。并且 CBO 会根据这个前提条件来计算 selectivity
和 cardinality,进而估算成本并选择执行计划。但是这种假设并不全是正确的,生产中列与列之间存在关联的现象并不罕见。目前可以用来缓解上
述负面影响的方法是使用动态采样和多列统计信息。但动态采样的准确性取决于采样数据的质量以及数量,而多列统计信息并不适合用于多表之间
有关联的情形,所以这两种方法只能算是缓解,并不算是完美的解决方案。
2)CBO 会假设所有的目标 SQL 都是独立运行的,并且互不干扰,但实际情况却不完全是这样。
3)CBO 对直方图统计信息有多方限制。主要体现在如下 2 个方面:
(1)在 oracle 12c 之前,frequency 类型的直方图所对应的 bucket 的数量不能超过 254,这样如果列的 distinct 数量超过 254,oracle 就会使
用 height balanced 类型的直方图。对于 height balanced 类型的直方图而言,oracle 不会记录所有的 nonpopular value 的值,所以此种情况
下 CBO 选错执行计划的概率会比 frequency 类型的情形要高。
(2)在 oracle 数据库里,如果针对文本类型的字段手机直方图统计信息,则 oracle 只会将文本的前 32 个字符(实际只取前 15 个)取出来并将
其转换为浮点数,然后将浮点数作为上述文本字段的直方图统计信息记录在数据字典里。
4)CBO 在解析多表关联的目标 SQL 时,可能会漏选正确的执行计划。在 oracle 11gR2 中,CBO 在解析这种多表关联的目标 SQL 时,所考虑的
各个表的连接顺序的总和受隐含参数_OPTIMIZER_MAX_PERMUTATIONS 的限制。这意味着目标 SQL 不管有多少种连接顺序,CBO 最多只考虑
其中根据_OPTIMIZER_MAX_PERMUTATIONS 计算出来的有限种可能性。
三、优化器基础知识
1、优化器的模式
优化器模式用于决定 oracle 在解析目标 SQL 时所选择的优化器类型,以及选择使用 CBO 时计算成本的侧重点。在 oracle 数据库中,优化器模式
由参数 OPTIMIZER_MODE 的值决定,通常 OPTIMIZER_MODE 的值为 RULE,CHOOSE,FIRST_ROWS_n(N=1、10、100、1000),FIRST_ROWS
或 ALL_ROWS。OPTIMIZER_MODE 的值得各个含义如下:
1)RULE
RULE 表示优化器使用 RBO 来解析目标 SQL,此时目标 SQL 所涉及的各个对象的统计信息对于 RBO 来说将毫无意义。
2)CHOOSE
CHOOSE 是 oracle 9i 中 OPTIMIZER_MODE 的默认值,他表示 oracle 在解析目标 SQL 时到底使用 CBO 还是 RBO 取决于目标 SQL 所涉及对象
是否有统计信息。具体来说:只要目标 SQL 对象含有统计信息,即使用 CBO,反之,使用 RBO 来解析目标 SQL。
3)FIRST_ROWS_n(N=1、10、100、1000)
FIRST_ROWS_n(N=1、10、100、1000)可以是 FIRST_ROWS_1、FIRST_ROWS_10、FIRST_ROWS_100、FIRST_ROWS_1000 中的任意一个值,
他表示 oracle 在解析目标 SQL 时,oracle 会使用 CBO 来解析目标 SQL,且此时 CBO 在计算各条执行路径的成本时的侧重点在于以最快相应速度
返回前 n 条数据。
4)FIRST_ROWS
FIRST_ROWS 是一个在 oracle 9i 中就过时的一个参数,他表示 oracle 在解析目标 SQL 时会联合使用 CBO 和 RBO。在大部分情况下,oracle 还
是会选用 CBO 作为解析目标 SQL,此时 oracle 的侧重点是以最快的相应速度返回前 n 行。在一些特俗情况下,oracle 会选用 RBO 来解析目标 SQL
而不考虑成本。比如当 OPTIMIZER_MODE 为 FIRST_ROWS 时有一个内置的规则,就是 oracle 如果发现能用相关索引来避免排序,则 oracle 就
会选择该索引所对应的路径而不考虑成本值。
5)ALL_ROWS
评论