对所有的关系型数据库而言,优化器无疑使其中最核心的部分,因为优化器负责解析SQL,而我们又都是通过SQL来访问存储在关系型数据库中的数据的。所有优化器的好坏直接决定该关系型数据库的强弱。
那什么是优化器呢(Optimizer)?优化器是ORACLE数据库中内置的一个核心子系统,你也可以把他理解成是ORACLE数据库中一个核心模块或者一个核心功能组件。优化器的目的是按照一定的判断原则来得到它认为的目标SQL在当前情形下最高的执行路径(Access Path),也就是说,优化器的目的就是得到目标SQL的执行计划。
Oracle的优化器(Optimizer)分为RBO(Rlue-Based Optimizer:基于规则的优化器)和CBO(Cost-Based Optimizer基于成本的优化器)这两中类型.为了得到目标SQL的执行计划,RBO所用的判断原则为一组内置的规则,这些规则是硬编码在ORACLE数据库代码中的,RBO会根据这些规则从目标SQL诸多的可能的执行计划中选择一个来 作为其执行计划;而CBO所用的判断原则为成本,CBO会从目标SQL诸多可能的执行路径中选择成本值最小的一条来作为其执行计划,各个执行路径的成本值是根据目标SQL语句所涉及的表,索引,列等相关对象的统计信息计算出来的。
其中在这个解析的过程中,ORACLE会执行对目标SQL的语法,语义和权限检查。
上面提到基于规则的优化器(RBO)是通过硬编码在ORACLE数据库代码中的一系列固定的规则,来决定目标SQL的执行计划的。具体就是ORACLE设置了1到15个等级,其中1等级表示执行效率最高,15对应的执行路径的执行效率最低。在ORACLE数据库里,对应OLTP类型的SQL语句而言,显然通过ROWID来访问时效率最高的方式,而通过全表扫描来访问的效率是最低的。于是,对应的等级1的执行路径是“single row by rowid(通过ROWID来访问单行数据)”,而等级15是“full table scan(全表扫描)”。
RBO在ORACLE中由来已久,虽然ORACLE 10G开始,RBO已经不再被ORACLE支持,但是RBO相关的功能并没有从ORACLE中移除。