一、优化器的模式
优化器的模式用于决定在Oracle中解析目标SQL时所用优化器的类型,以及决定当使用CBO时计算成本值的侧重点。这里的“侧重点”是指当使用CBO来计算目标SQL各条执行路径的成本值时,计算成本值的方法会随着优化模式的不同而不同。
在Oracle数据库中,优化器的模式是由参数OPTIMIZER_MODE的值决定的,OPTIMIZER_MODE的值可能是RULE、CHOOSE、FIRST_ROWS_n(N=1,10,100,1000)、FIRST_ROWS或ALL_ROWS。
OPTIMIZER_MODE的各个可能的值的含义为如下所示:
1.RULE
RULE表示Oracle将使用RBO来解析目标SQL,此时目标SQL中所涉及的各个对象的统计信息对于RBO来说没有任何作用。
2.CHOOSE
CHOOSE是Oracle9i中OPTIMIZER_MODE的默认值,它表示Oracle在解析目标SQL是到底是使用RBO还是使用CBO取决于该SQL中所涉及的表对象是否有统计信息。具体来说就是:只要该SQL中所涉及的表对象中有一个有统计信息,那么Oracle在解析该SQL时就会使用CBO;如果该SQL中所涉及的所有表对象均没有统计信息,那么此时Oracle会使用RBO。
3.FIRST_ROWS_n(n=1,10,100,1000)
其含义是指当OPTIMIZER_MODE的值为FIRST_ROWS_n(n=1,10,100,1000)时,Oracle会使用CBO来解析目标SQL,且此时CBO在计算该SQL的各条执行路径的成本值时的侧重点在于以最快的响应速度返回头n(n=1,10,100,1000)条记录。Oracle会把那些最快的响应速度返回头(n=1,10,100,1000)条记录所对应的执行步骤的成本修改成一个很小的值(远小于默认情况下CBO对同样执行步骤所计算出的成本值)。这样Oracle就既没有违背CBO选择执行计划的总原则(成本值最小),同样又兼顾 了FIRST_ROWS_n(n=1,10,100,1000)的含义。
4.FIRST_ROWS
FIRST_ROWS是一个在Oracle9i中就已经过时的参数,它表示Oracle在解析目标SQL是会联合使用CBO和RBO。这里联合使用CBO和RBO的含义是指在大多数情况下,FIRST_ROWS还是会使用CBO来解析目标SQL,且此时CBO在计算该SQL的各条执行路径的成本值时的侧重点在于以最快的响应速度返回头几条记录(类似于FIRST_ROWS_n);但是,当出现一些特定情况时,FIRST_ROWS转而会使用RBO中的一些内置规则来选取执行计划而不再考试成本。比如当OPTIMIZER_MODE的值为FIRST_ROWS有一个内置的规则,就是如果Oracle发现能用相关的索引来避免排序,则Oracle就会选择该索引所对应的执行路径而不再考虑成本,这显然是不合理的。与这对应的,在当OPTIMIZER_MODE的值为FIRST_ROWS的情形下,你会发现索引全扫描出现的概率会比之前有所增加,这是因为走索引全面扫描能够避免排序的缘故。
5.ALL_ROWS
ALL_ROWS是Oracle 10g以及后续Oracle数据库版本中OPTIMIZER_MODE的默认值,它表示Oracle会使用CBO来解析目标SQL,且此时CBO在计算该SQL的各条执行路径的成本值时的侧重点在于最佳的吞吐量(即最小的系统I/O和CPU资源的消耗量)。
实际上,成本的计算方法随着优化器模式的不同而不同,主要体现在ALL_ROWS和FIRST_ROWS_n(n=1,10,100,1000)对成本值计算方法的影响上。当优化器模式为ALL_ROWS时,CBO计算成本的侧重点在于最佳的吞吐量;而当优化器模式为FIRST_ROWS_n(n=1,10,100,1000)时,CBO计算成本的侧重点会变为以最快的响应速度返回头n(n=1,10,100,1000)条记录。这意味着同样的执行步骤,在优化器模式不同时CBO分别计算出来的成本会存在巨大的差异,这也就意味着优化器对CBO计算成本(进而对CBO选择执行计划)有着决定性的影响。
二、结果集
结果集(Row Source)是指包含指定执行结果的集合。对于优化器而言(无论是RBO还是CBO),结果集和目标SQL执行计划的执行步骤相对应,一个执行步骤所产生的执行结果就是该执行步骤所对应的输出结果集。
对于目标SQL的执行计划而言,其中某个执行步骤的输出结果就是该执行步骤所对应的输出结果集,同时,该执行步骤所对应的输出结果集可能就是下一个执行步骤的输入结果集。这样一步一步执行下来,伴随的就是结果集在各个执行步骤之间的传递,等目标SQL执行计划的各个执行步骤全部执行完毕后,最后的输出结果集就是该SQL最终的执行结果。
对于RBO而言,我就在对应的执行计划中看不到相关执行步骤所对应的结果集的描述,虽然结果集的概念对于RBO来说也同样适用。
对于CBO而言,对应执行中的Rows列反映的就是CBO对于相关执行步骤所对应输出结果集的记录数(即Cardinality)的估算值。
三、访问数据的方法
对于优化器而言,它在解析目标SQL、得到其执行计划时至关重要的一点是决定访问数据的方法,即优化器要决定采用什么样的方式和方法去访问目标SQL所需要访问的存储在Oracle数据库中的数据。