【Oracle】优化器的模式

声明:以下内容针对Oracle 11g而言。

优化器的模式用于决定在Oracle中解析目标SQL时所用的优化器的类型,以及决定当使用CBO时计算成本值的侧重点。所谓的"侧重点"指的就是CBO在计算目标SQL执行路径成本值时,计算成本值的方法会随着优化器模式的不同而不同。

在Oracle中,优化器的模式是由参数optimizer_mode的值来决定的,下表为该参数的值的解释:

描述
RULE 表示切换为RBO来解析目标SQL
CHOOSE CHOOSE为Oracle 9i中的默认值,选择性使用CBO或RBO,选择依旧为:是否存在统计信息,存在则使用CBO,否则使用RBO
FIRST_ROWS_n(n=1,10,100,1000) 设置为FIRST_ROWS_n,则使用CBO来解析目标SQL,此时CBO在计算该SQL的各执行路径的成本值的时候的侧重点在于以最快的响应速度返回前n(n=1,10,100,1000)条记录。此处以FIRST_ROWS_10举例子说明,众所周知,CBO正常来说是选择消耗IO/CPU资源最少的执行路径作为最佳选择,当设置这个参数后,CBO的最佳选择就变成了哪条路径返回前10条记录的速度最快,就以哪条路径为最佳选择。
FIRST_ROWS(不需要关注) 在Oracle 9i中就已经过时的参数,该参数会使Oracle在解析目标SQL的时候联合使用CBO和RBO,大多数情况下,FIRST_ROWS还是使用CBO来解析,此时与FIRST_ROWS_n类似,侧重于以最快的速度返回前几条记录。但是,在一些特殊情况下,则不然,如Oracle发现能用相关的索引来避免排序,则Oracle就会选择该索引对应的执行路径而不再考虑成本,这显然是不合理的。与之对应的,在设置为该参数时,出现索引全扫描的概率比之前有所增加,这就是因为走做引扫描能够避免排序的缘故。
ALL_ROWS 表示使用CBO解析目标SQL,侧重于最佳的吞吐(IO/CUP资源消耗最小原则)

之所以在上文说,计算成本值的方法会随着优化器模式的不同而不同,主要体现在ALL_ROWS与FIRST_ROWS_n在对成本计算方法的影响上。

当选择ALL_ROWS时,则侧重于吞吐量。

当选择FIRST_ROWS_n时,则侧重于返回前n条记录的响应速度。

这就意味着执行同样的查询语句,通过这两种方法计算出来的成本值则会大有差别。

原文地址:https://www.cnblogs.com/OliverQin/p/12739615.html