background image

Oracle 数据库的优化

摘要:本文提出了一种优化

Oracle 数据库的方法。Oracle 中 SQL 语句的执行过程可分为解析

Parse)、执行(Execute)和提取结果(Fetch)三步,此方法就是通过对 SQL 语句在

Oracle 数据库中优化执行的三个过程来提高 Oracle 数据库的性能。

 

 

 

 

关键词:数据库; 扫描; 多表联结; 子查询

1.如何优化 Parse

11 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在共享池中重用 SQL 语句

     当 SQL 语句被传递给 Oracle 处理时,其秘诀是重复使用已经在共享池中的语句,而不是让
Oracle 在接受语句时去准备新的语句。前面表明,如果 Oracle 接受了一个与共享池中的语句相
一致的语句,就重用共享池中的语句。
     Oracle 提供在数据库中存储代码的能力。当应用系统开始运行时,从数据库中读取代码(可

PL/SQL 语句编制)并像其它语句那样传递到共享池中去处理。从数据库中取出的代码是编译

过的并驻留在共享池中。

如何优化 Execute 和 Fetch

2避免无计划的全表扫描

全表扫描连续从表读取所有数据,而不管数据是否与查询有关。避免不必要的全表扫描有两

个充足理由:

1 全表扫描没有选择性。2 通过全表扫描读取的数据很快从 SGA 的缓冲区移走(如

果正在扫描的表不是 高速存储 的表)

在基于规则优化的情况下,如果下列任何条件在

SGA 语句出现,就要对一个表进行全表扫

描。
    1  

) 该表无索引

    2  

) 对返回的行无任何限定条件(如无

Where 语句)

    3  

) 对数据表与任何索引主列相对应的行无限定条件。例如,在

City-State-Zip 列上创建

了三列复合索引,那么仅对

State 列有限定条件的查询不能使用这个索引,因为 State 不是索

引的主列。
    4  

) 对索引主列的行有限定条件,但条件或者是

NULL 或者是不相等。例如,City 列上存在索

引,在所有下列情况下都不会使用索引。