基于规则的优化器(Rule Based Optimizer,RBO)内部采用了一种规则列表,其中每一种规则代表一种执行路径并被赋予一个等级,不同的等级代表不同的优先级别。等级越高的规则越会被优先采用。Oracle会在代码里事先给各种类型的执行路径定一个等级,一共有15个等级,从等级1到等级15。Oracle会认为等级值低的执行路径的执行效率比等级值高的执行效率高。在决定目标SQL的执行计划时,如果可能的执行路径不止一条,则RBO就会从该SQL多种可能的执行路径中选择一条等级最低的执行路径来作为其执行计划。
RBO的具体规则
下面我们就来看看RBO的具体规则,如表1所示。
下面针对表1中所示的每一种规则的含义及其用法进行说明。
Single Row by ROWID:根据ROWID,返回一条记录。这种规则发生在SQL语句的WHERE部分,指定了记录的ROWID或者使用了CURRENT OF CURSOR形式的SQL。
Single Row by Cluster Join:根据聚簇连接,返回一条记录。这种规则发生在SQL语句中WHERE部分,包含了两表关联,且关联字段为一个聚簇,同时还存在一个过滤条件为一个表的唯一索引或主键。
Single Row by Hash Cluster Key with Unique or Primary Key:根据哈希聚簇键,返回一条记录。这种规则发生在SQL语句的WHERE部分所包含的过滤条件中,字段是一个哈希聚簇键且这个字段为唯一或主键索引字段。
Single Row by Unique or Primary Key:根据主键或唯一索引键值,返回一条记录。这种规则发生在SQL语句中WHERE部分,为唯一或主键所有字段的等值连接条件。
基于成本的优化器(Cost Based Optimizer, CBO)在坚持实事求是的基础上,通过对具有现实意义的诸多要素的分析和计算来完成最优路径的选择工作。这里的关键点在于对成本的理解,后面会有对成本的专门介绍。这里简单交代一句,成本可以理解为SQL执行的代价。成本越低,SQL执行的代价越小,CBO也就认为这是一个更优异的执行路径。