ORACLE 的优化器
优化器有时也被称为查询优化器,这是因为查询是影响数据库性能最主要的部分,不
要 以 为 只 有
SELECT 语 句 是 查 询 。 实 际 上 , 带 有 任 何 WHERE 条 件 的
DML(INSERT、UPDATE、DELETE)语句中都包含查询要求,在后面的文章中,当说到查
询时,不一定只是指
SELECT 语句,也有可能指 DML 语句中的查询部分。优化器是所有关
系数据库引擎中的最神秘、最富挑战性的部件之一,从性能的角度看也是最重要的部分,它
性能的高低直接关系到数据库性能的好坏。
我们知道,
SQL 语句同其它语言(如 C 语言)的语句不一样,它是非过程化( non-
procedural)的语句,即当你要取数据时,不需要告诉数据库通过何种途径去取数据,如到
底是通过索引取数据,还是应该将表中的每行数据都取出来,然后再通过一一比较的方式
取数据(即全表扫描),这是由数据库的优化器决定的,这就是非过程化的含义,也就是
说,如何取数据是由优化器决定,而不是应用开发者通过编程决定。在处理
SQL 的
SELECT、UPDATE、INSERT 或 DELETE 语句时,Oracle 必须访问语句所涉及的数据 ,
Oracle 的优化器部分用来决定访问数据的有效路径,使得语句执行所需的 I/O 和处理时间
最小。
为了实现一个查询,内核必须为每个查询定制一个查询策略,或为取出符合条件的数
据生成一个执行计划(
execution plan)。典型的,对于同一个查询,可能有几个执行计划都
符合要求,都能得到符合条件的数据。例如,参与连接的表可以有多种不同的连接方法,这
取决于连接条件和优化器采用的连接方法。为了在多个执行计划中选择最优的执行计划,优
化器必须使用一些实际的指标来衡量每个执行计划使用的资源(
I/0 次数、CPU 等),这些
资源也就是我们所说的代价(
cost)。如果一个执行计划使用的资源多,我们就说使用执行
计划的代价大。以执行计划的代价大小作为衡量标准,优化器选择代价最小的执行计划作为
真正执行该查询的执行计划,并抛弃其它的执行计划。
在
ORACLE 的发展过程中,一共开发过 2 种类型的优化器:基于规则的优化器和基于
代价的优化器。这
2 种优化器的不同之处关键在于:取得代价的方法与衡量代价的大小不同。
现对每种优化器做一下简单的介绍:
一、基于规则的优化器
-- Rule Based (Heuristic
)
Optimization(简称 RBO):
在
ORACLE7 之前,主要是使用基于规则的优化器。ORACLE 在基于规则的优化器中
采用启发式的方法(
Heuristic Approach)或规则(Rules)来生成执行计划。例如,如果一