sql优化器基于规则优化器和基于成本优化器的区别
Oracle有两种优化器:RBO和CBO。 RBO的最大的问题在于靠硬编码在ORACLE数据库代码中的一系列规定的规则来决定目标SQL的执行计划的,而并没有考虑目标SQL中所涉及的对象的时间数据量,实际数据分布情况,这样一旦规定规则并不适用于该SQL中所涉及的实际对象时,RBO根据规定规则产生的执行计划就很可能不是当前情况下的最优执行计划了。
下面我们来看如下的例子:
select * from EMP_TEMP where manager_id=100;
假设在EMP_TEMP的manager_id上事先有名为IDX_MGR_TEMP的单键值B数索引,如果我们用的是RBO,则不管EMP_TEMP的数据量多大,也不管MANAGER_ID的数据分布如何,ORACLE执行的时候始终会选择做对IDX_MGR_TEMP的范围索引扫描,并回表取得EMP_TEMP中的记录。ORACLE是不会选择全表扫描EMP_TEMP表的,因为对于RBO而言,全表扫描的等级值要高于索引范围扫描值的等级值。
RBO的这种选择在表EMP_TEMP的数据量不大,而且满足manager_id=10的条件的记录少的情况下是影响不大的,如果表EMP_TEMP的数据量非常大,例如1000万条记录,
而且这1000万条记录的MANAGER_ID的值都是100,在这种极端的情况下,如果是RBO,显然它