Oracle 数据库的优化
摘要:本文提出了一种优化
Oracle 数据库的方法。Oracle 中 SQL 语句的执行过程可分为解析
(
Parse)、执行(Execute)和提取结果(Fetch)三步,此方法就是通过对 SQL 语句在
Oracle 数据库中优化执行的三个过程来提高 Oracle 数据库的性能。
关键词:数据库; 扫描; 多表联结; 子查询
1.如何优化 Parse
1.1 SQL 语句的 Parse 处理步骤:
1
) 计算语句值
2
) 共享池中有无与此语句值相同的语句?
3
) 共享池中有与此语句字符完全匹配的语句?
4
) 准备要运行的
SQL 语句
5
) 为新语句在共享池中创建空间
6
) 将语句存放在共享池中
7
) 修改共享池图,标明语句的值和在共享池中的位置
8
) 执行准备好的
SQL 语句
最理想的是,语句只执行 1、2、3 和 8 步来进行处理。不经过 2、3 步来测试被传给 Oracle 的语
句要使用
1~8 步进行处理。只经过 1、2、3、8 的 SQL 语句要比经过 1~8 步的语句更为有效。
1.2 在共享池中重用 SQL 语句
当 SQL 语句被传递给 Oracle 处理时,其秘诀是重复使用已经在共享池中的语句,而不是让
Oracle 在接受语句时去准备新的语句。前面表明,如果 Oracle 接受了一个与共享池中的语句相
一致的语句,就重用共享池中的语句。
Oracle 提供在数据库中存储代码的能力。当应用系统开始运行时,从数据库中读取代码(可
用
PL/SQL 语句编制)并像其它语句那样传递到共享池中去处理。从数据库中取出的代码是编译
过的并驻留在共享池中。
2 如何优化 Execute 和 Fetch
2.1 避免无计划的全表扫描
全表扫描连续从表读取所有数据,而不管数据是否与查询有关。避免不必要的全表扫描有两
个充足理由:
1 全表扫描没有选择性。2 通过全表扫描读取的数据很快从 SGA 的缓冲区移走(如
“
”
果正在扫描的表不是 高速存储 的表)
在基于规则优化的情况下,如果下列任何条件在
SGA 语句出现,就要对一个表进行全表扫
描。
1
) 该表无索引
2
) 对返回的行无任何限定条件(如无
Where 语句)
3
) 对数据表与任何索引主列相对应的行无限定条件。例如,在
City-State-Zip 列上创建
了三列复合索引,那么仅对
State 列有限定条件的查询不能使用这个索引,因为 State 不是索
引的主列。
4
) 对索引主列的行有限定条件,但条件或者是
NULL 或者是不相等。例如,City 列上存在索
引,在所有下列情况下都不会使用索引。