Oracle 性能优化——Oracle 基础了解
【前言】
随着Oracle的版本升级,以及系统的迭代更新,业务数据的增加,可能就会到很多Oracle的性能问题。因此我们不仅仅需要知道怎么去发现、解决Oracle性能问题,而这是一个需要长期进行的过程。我们一边学习、工作,一边累计相关的Oracle 相关知识与技能。
一. 了解Oracle
1. Oracle 体系结构
作为 Oracle 学习的预备知识,简单了解一下 Oracle 数据库的体系结构是必要的,这对相关Oracle的问题处理十分有益。
i. Oracle 的执行过程
无论 Java 还是 PLSQL,每一条 SQL 语句在客户端都表现为一个上下文区域,或者一个游标, 如下图,是对一条 SQL 语句游标的生命周期的简单描述。

-
-
-
创建游标
-
-
游标是内存中的一块区域,Oracle 利用它来保存 SQL 语句的相关信息。主要包括 SQL 语句的 解析内容、执行计划和一个指向当前记录的指针。
-
-
-
检查缓存的 SQL 语句
-
-
为了处理多次请求,避免重复的解析,Oracle 维护一个缓存,来保存最近执行的 SQL 语句以及 对应的执行计划。这个缓存保存在共享池中(shared pool)。
-
-
-
解析 SQL 语句
-
-
解析 SQL 语句主要包括:
a. 检查 SQL 语句的语法是否有效。
b. 检查 SQL 语句在语义上是否有效。
c. 检查用户是否具有对相关对象执行给定操作的安全权限。
d. 确定 SQL 语句的执行计划。
-
-
-
关联绑定变量
-
-
当 SQL 语句中包含变量,在每次执行时可以变化。通常这些变量都是 SQL 语句的参数,我们通 常使用绑定变量 (bind variable) 的方式来指定这些变量。
-
-
-
执行 SQL 语句
-
-
当执行的是 DML 语句(insert,update,delete,merge),执行这条语句后将导致 SQL 立即变 动,尽管在 commit 语句执行前这个变更不会被持久化。 当执行的查询语句(select),执行这条语句只是为了提取(fetch)操作准备好游标。
-
-
-
提取记录
-
-
从程序角度看,数据返回给客户端是由 fetch 调用完成的,fetch 调用从数据库提取数据,可以 是一条或者多条。在内部,Oracle 可以从高速缓存中提取数据,客户端结果缓存(client-side result cache)或者服务器端结果缓存(server-side result cache)中返回这个结果集。
-
-
-
处理结果集
-
-
SQL 查询的输出被称为结果集,结果集包含行和列,可以认为它是一个包含查询结果的临时表。
-
-
-
关闭游标
-
-
关闭游标会释放与该游标相关的所有内存。
基于 SQL 语句的执行过程,不考虑 SQL 本身,从优化 Oracle API 调用的角度看,应用程序访 问 Oracle 数据库,主要有下面三种方式来取得最佳性能。
-
-
- 尽量确保 SQL 语句在应用中都可重用。这可以降低对 Oracle 的解析调用,从而降低 CPU 的开销和数据库的争用。
- 尽量使用绑定变量,以确保 SQL 语句可以在会话内部以及在会话之间实现共享。这样可以 提高在共享池中找到相匹配的 SQL 语句的机会,从而降低解析操作的开销。
- 尽可能利用批量提取来提高查询和插入操作的性能。使用批量提取功能可以降低对 Oracle 的调用次数,也可以降低网络流量。
-
ii. Oracle服务器体系结构
下图简单描述了 Oracle 服务器的体系结构,包括主要的内存区域、进程、磁盘文件和相关的数 据流。

-
-
实例与数据库
-
Oracle 数据库由一组逻辑的数据模式组成,所有的数据模式都存储在一组特定的数据文件上。 通常每个模式描述一个应用的数据模型。 Oracle 数据库实例是运行中的 Oracle 软件的一个单次发生,它由一个共享内存区域和各种 Oracle 后台进程组成。 非 RAC (Real Application Cluster,真正应用集群)环境数据库和实例是一对一关系,而 RAC 环 境一个数据库由多个实例组成。
-
-
系统全局区
-
SGA (System Global Area) 是一个所有 Oracle 会话都可以访问的共享内存区域。SGA 包括多 个独立的内存区域,主要有:
-
-
-
缓冲池
-
-
缓冲区高速缓存,保存数据文件中数据块的副本。
-
-
-
共享池
-
-
保存缓存的 SQL 和 PLSQL 语句。
-
-
-
大池
-
-
缓存共享的服务器会话状态、大的 PLSQL 块以及并行执行的消息缓存。
-
-
-
Java 池
-
-
缓存 Java 存储过程和程序。
-
-
-
重做缓冲区
-
-
缓存没有写到磁盘重做日志文件的日志条目。
-
-
数据缓存
-
Oracle 11g 提供了多个级别的数据缓存。
客户端结果集缓存。
服务端结果集缓存。
缓冲池缓存。
-
-
程序全局区
-
PGA (Program Global Area) 是特定进程可见的内存区域,该区域保存一个进程的数据和进程信 息,该区域不是共享的。主要由排序工作区和临时结果集组成。
-
-
- 段与文件
-
数据保存在数据库中,作为文件保存在磁盘上。在数据库内部,段是各类数据的逻辑容器。
-
-
- 表
-
表是数据库存储的基本逻辑单元,可以代表关系模型(relational model)中的实体(entity)。 Oracle 中有多种表类型,这里我们只介绍堆表(heap table)。堆表中存储的数据没有特定的顺 序,每一条数据都通过 ROWID 唯一标示,也就是说可以通过 ROWID 来的定位记录在磁盘上的 位置。
-
-
- 索引
-
索引的目的是为了 SQL 语句和数据库的性能。Oracle 提供了多种索引结构,这里我们只介绍 B*树索引。B*树索引由层次树状结构组成,每一层都包含指向下一层的指针,最顶层是根节点, 最底层是叶子块,指向他们对应的数据记录。
-
-
- 块、区间、段
-
块是 Oracle 中存储的最小单位。块的大小通常是操作系统块大小的倍数。 区间是逻辑划分的下一级。它是一组连续的块。 段是分配在逻辑结构的一组区间。 可以用下图表示三者之间的逻辑关系:
-
-
表空间与数据文件
-
段必须属于一个特定的表空间。 表空间由多个数据文件组成。 段可以分布在多个数据文件上,但一个区间只能位于一个特定的数据文件中。 表空间和数据文件的关系如下图所示:
-
-
- 回滚段
-
为了支持 rollback 语句,也就是回滚还没有提交的事务,Oracle 将被修改的数据块的前镜像副 本保存在一个被称为回滚段的结构中。这些段也用来实现一致读(consistent read),以确保查 询期间表上发生的改变不会反映到查询结果中。
-
-
- 重做日志与归档日志
-
Oracle 在提交事务时,使用事务日志来记录事务信息,这个日志被称为重做日志。 当日志上的所有信息都已经写入数据库,并且日志已经归档后,在线日志可以被覆盖掉。 归档日志是在线日志的副本,当出现磁盘故障时可以用它作为时间基点进行数据恢复。
-
-
- 闪回日志
-
闪回日志保存回滚信息,如果发生逻辑损坏,就可以用这个信息,来回滚数据库到之前的某个时 间点。
iii.应用集群
RAC (Real Application Cluster,真正应用集群) 数据库是一个共享磁盘的集群数据库。 RAC 数据库的每一个成员都有一个独立的 Oracle 实例,都拥有其独有的共享内存、进程与会话。 所有实例之间共享一组共同的数据文件,这些数据文件通过一个集群文件系统对所有实例都可见。假如数据库由两个节点,通过 Cluster 互联构成,如下图所示:


浙公网安备 33010602011771号