第一章 Oracle里的优化器
1.1 什么是Oracle里的优化器
优化器(Optimizer)是Oracle数据库中内置的一个核心子系统,也可以把它理解成是Oracle数据库中的一个核心模块或者一个核心功能组件。优化器的目的是按照一定的判断原则来得到它认为的目标SQL在当前情形下最高效的执行路径(Access Path),其实就是说,优化器的目的就是为了得到目标SQL的执行计划。
依据选择执行计划时所用的判断原则,Oracle数据库里的优化器又分为RBO和CBD这两种类型。RBO是Rule-Based Optimizer的缩写,直译过来就是“基于规则的优化器”;相应的,CBO是Cost-Based Optimizer的缩写,直译过来就是“基于成本的优化器”。
在得到目标SQL的执行计划时,RBO所用的判断原则为一组内置的规则,这些规则是硬编码在Oracle数据库的代码中的。RBO会根据这些规则从目标SQL诸多可能的执行路径中选择一条来作为其执行计划;而CBO所用的判断原则为成本,CBO会从目标SQL诸多可能的执行路径中选择成本最小的一条来作为其执行计划,各个执行路径的成本值是根据SQL语句所涉及的表、索引、列等相关对象的统计信息出来的。
Oracle数据库里SQL语句的执行过程可以用图来表示。
1.1.1 基于规则的优化器
RBO是一种适用于OLTP类型的SQL语句的优化器,通过ROWID来访问是效率最高的方式,而通过全表扫描来访问则是效率最低的方式。与之对应的执行路径就是“Single row by rowid”,最低的执行路径则是“full table scan”。
RBO在Oracle中由来已久,虽然从Oracle 10g开始,RBO已不在支持,但RBO的相关实现代码并没有从Oracle数据库代码中移除,这意味着即使在Oracle 11g中,依然可以通过修改优化器模式或使用Rule Hint来继续使用RBO。
只要出现如下的情形之一,那么即便修改了优化器或者试用了Rule Hint,Oracle依然不会使用RBO(而是强制使用CBO):
目标SQL中涉及的对象有IOT(Index Organized Table)。
目标SQL中涉及的对象有分区表。
使用了并行查询或者并行DML。
使用了星型连接。
使用了哈希连接。
使用了索引快速全扫描。
使用了函数索引。
… …
之前提到:RBO会从目标SQL诸多可能的执行路径中选择一条等值最低的作为执行计划,但如果出现了两条或者两条以上等级值相同的执行路径的情况,那么此时PBO会如何选择?很简单,此时RBO会依据目标SQL中涉及的相关对象在目标SQL文本中出现的先后顺序来综合判断。这也就意味着我们还可以通过调整相关对象在数据字典缓存中的顺序,改变目标SQL中涉及的各个对象在该SQL文本中出现的先后顺序来调整其执行计划。
基于Oracle的SQL优化-崔华(学习笔记)
最新推荐文章于 2024-01-31 17:33:42 发布