Oracle
1. oracle 的优化器
的优化器有三种 A、RULE(基于规则) B、COST(基于成本) C、CHOOSE (选择性)
设 置 缺 省 的 优 化 器 可 以 通 过 对 。 文 件 中 参 数 的 各 种 声 明 如
。 你当然也在 句级或是会话 !!!"级
对其进行覆盖。
为了使用基于成本的优化器 #!$#!%&'("你必须经常运行 )(命令以增加
数据库中的对象统计信息 *+!!!"的准确性。
如果数据库的优化器模式设置为选择性 "那么实际的优化器模式将和是否运行过 )(
命令有关。 如果 * 已经被 )( 过优化器模式将自动成为 #反之数据库将采用
形式的优化器。
在缺省情况下,ORACLE 采用 CHOOSE 优化器, 为了避免那些不必要的全表扫描 (full table
scan) , 你必须尽量避免使用 CHOOSE 优化器,而直接采用基于规则或者基于成本的优化器。
2. 访问 table 的方式
1)全表扫描
,,,,,,全表扫描就是顺序地访问表中每条记录。 采用一次读入多个数据块 %*!*-"的方
式优化全表扫描。
2) 通过 ROWID 访问表
,,你可以采用基于 的访问方式情况,提高访问表的效率, 包含了表中记录的物理位
置信息。 采用索引 ./"实现了数据和存放数据的物理位置 "之间的联系。通
常索引提供了快速访问 的方法,因此那些基于索引列的查询就可以得到性能上的提高。
3. 共享 SQL 语句
为了不重复解析相同的 语句,在第一次解析之后, 将 语句存放在内存中。这块
位于系统全局区域 0 !)!'1*"的共享池 !2%*34&"中的内存可以被所有
的数据库用户共享。 因此,当你向 提交一个 语句时, 会首先在这块内存中
查找相同的语句,如果它和之前的执行过的语句完全相同 这里需要注明的是, 对两者采取
的是一种严格匹配,要达成共享, 语句必须完全相同包括空格,换行等", 就能很快
获得已经被解析的语句以及最好的执行路径。但是 ORACLE 只对简单的表提供高速缓冲(cache
bu&ering),这个功能并不适用于多表连接查询。
数据库管理员必须在 。 中为这个区域设置合适的参数,当这个内存区域越大,就可以保留更
多的语句,当然被共享的可能性也就越大了。
共享的语句必须满足三个条件:
,,,5"字符级的比较: 当前被执行的语句和共享池中的语句必须完全相同。
6"两个语句所指的对象必须完全相同:
7"两个 语句中必须使用相同的名字的绑定变量 *%8*!"。
4. 选择基础表
所谓基础表是被最先被访问的表通常是以全表扫描的方式被访问由于优化器不同 语句的基础
表的选择也不同。
1) 优化器会检查 中每个表的物理大小索引状态然后选择花费最底的执行路径。他会
自己选择基础表。
2) 优化器在所有连接条件都有索引对应的前提下选择 子句中最后那个表作为基础表。
ORACLE 的解析器按照从右到左的顺序处理 FROM 子句中的表名,因此 FROM 子句中写在最
后的表(基础表 driving table)将被最先处理。 在 子句中包含多个表的情况下你必须
选择记录条数最少的表作为基础表。当 处理多个表时会运用排序及合并的方式连接