background image

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)来生成执行计划。例如,如果一