进程简介
进程是在操作系统中可以运行一系列步骤的机制。
该机制取决于操作系统。例如,Windows 上的一个 Oracle 后台进程是在某个进程内执行的一个线程。在 Linux 和 UNIX 上,Oracle进程要么是操作系统进程,要么是操作系统进程中的线程。
进程运行代码模块。所有已连接的 Oracle 数据库用户必须运行以下模块来访问数据库实例:
- 应用程序或 Oracle 数据库实用程序
数据库用户运行一个数据库应用程序,如预编译器程序或数据库工具(如 SQL*Plus),来向数据库发出 SQL 语句。 - Oracle 数据库代码
每个用户都具有为其运行的 Oracle 数据库代码,以解释和处理应用程序的 SQL 语句。
进程通常在其自己的私有内存区内运行。大多数进程可以定期写入一个关联的跟踪文件。
进程类型
数据库实例包含或与多个进程交互。
进程可分为以下类别:
- 客户端进程,运行应用程序或 Oracle 工具代码。
- Oracle 进程是运行 Oracle 数据库代码的执行单元。在多线程体系结构中,Oracle 进程可以是操作系统进程,也可以是操作系统进程中的线程。Oracle 进程包括以下子类型:
- 后台进程,与数据库实例同时启动,并执行一些维护任务,如执行实例恢复、清理进程、将重做缓冲区写入磁盘等。
- 服务器进程,基于客户端请求,执行相应的工作。
例如,这些进程解析 SQL 查询、将查询放入共享池、为查询创建并执行查询计划和将数据从数据库缓冲区高速缓存(或从磁盘)读入缓冲区。 - 从属进程,为后台进程或服务器进程执行额外任务。
进程的结构取决于操作系统,以及选择了哪些 Oracle 数据库选项。例如,已连接用户的代码可能会配置为专用服务器或共享服务器的连接。在一个共享服务器的体系结构中,每个运行数据库代码的服务器进程可以为多个客户端进程服务。
图 15-1 显示了使用专用服务器连接时的系统全局区(SGA)和后台进程。对每个用户连接,应用程序由一个客户端进程来运行,而由其专用服务器进程来运行数据库代码。每个客户端进程都与其自己的服务器进程相关联,而每个服务器进程都有其自己的程序全局区(PGA)。

多进程和多线程Oracle数据库系统
多进程 Oracle 数据库 (也称为多用户 Oracle Database) 使用几个进程来运行 Oracle 数据库代码的不同部分,并为用户运行一些其他进程——要么每个连接的用户一个进程,或由多个用户共享一个或多个进程。
大多数数据库都是多用户的,因为数据库的主要优势是管理同时由多个用户所需的数据。数据库实例中的每个进程执行某个特定的作业。通过将数据库和应用程序的工作划分成几个进程,多个用户和应用程序可以同时连接到实例,而系统仍可提供较好的性能。
在 Oracle Database 12c 之前的版本中,Oracle 进程不能作为线程在 UNIX 和 Linux 系统上运行。从 Oracle Database 12c 开始,多线程 Oracle 数据库模型允许 Oracle 进程作为操作系统线程在单独的地址空间中执行。安装 Oracle Database 12c后,数据库将以进程模式运行。必须将 THREADED_EXECUTION 初始化参数设置为 TRUE,才能在线程模式下运行数据库。在线程模式下,UNIX 和 Linux 上的一些后台进程作为进程运行(每个进程包含一个线程),而剩余的 Oracle 进程作为进程中的线程运行。
在以线程模式运行的数据库中,PMON 和 DBW 可以作为操作系统进程运行,而 LGWR 和 CMON 可以作为单个进程中的线程运行。两个前台进程和一个并行执行(parallel execution, PX)服务器进程可以作为第二个操作系统进程中的线程运行。第三个操作系统进程可能包含多个前台线程。因此,“Oracle 进程”并不总是意味着“操作系统进程”。
例 15-1 查看 Oracle 进程元数据
V$PROCESS 视图包含连接到数据库实例的每个 Oracle 进程的一行。例如,您可以在 SQL*Plus 中运行以下查询,以获得每个进程的操作系统进程 ID 和操作系统线程 ID:
COL SPID FORMAT a8
COL STID FORMAT a8
SELECT SPID, STID, PROGRAM FROM V$PROCESS ORDER BY SPID;
查询产生以下部分样本输出:
SPID STID PROGRAM
----- ----- ---------------------------
7190 7190 oracle@samplehost (PMON)
7192 7192 oracle@samplehost (PSP0)
7194 7194 oracle@samplehost (VKTM)
7198 7198 oracle@samplehost (SCMN)
7198 7200 oracle@samplehost (GEN0)
7202 7202 oracle@samplehost (SCMN)
7202 7204 oracle@samplehost (DIAG)
7198 7205 oracle@samplehost (DBRM)
7202 7206 oracle@samplehost (DIA0)
.
.
.
客户端进程概述
当用户运行一个应用程序(如 ProC 程序或 SQLPlus)时,操作系统会创建一个客户端进程(有时称为用户进程)来运行用户应用程序。客户端应用程序具有已链接到进程的 Oracle 数据库库文件,以提供与数据库进行通信所需的 API。
客户端进程和服务器进程
客户端进程和与实例直接交互的 Oracle 进程在某些重要方面不同。
为客户端进程服务的 Oracle 进程可能会读取或写入 SGA,而客户端进程不能。客户端进程可以在数据库主机之外另一台主机上运行,而 Oracle 进程不能。
例如,假设在客户端主机上的某个用户启动 SQL*Plus,并同时通过网络连接到另一台主机上的 sample 数据库(当数据库实例还未启动时):
SQL> CONNECT SYS@inst1 AS SYSDBA Enter password: ********* Connected to an idle instance.
在客户端主机上,搜索 sqlplus 或 sample 相关进程,显示只有 sqlplus 客户端进程:
% ps -ef | grep -e sample -e sqlplus | grep -v grep clientuser 29437 29436 0 15:40 pts/1 00:00:00 sqlplus as sysdba
在数据库主机上,搜索 sqlplus 或 sample 相关进程,显示一个非本地连接的服务器进程,但没有客户端进程:
% ps -ef | grep -e sample -e sqlplus | grep -v grep serveruser 29441 1 0 15:40 ? 00:00:00 oraclesample (LOCAL=NO)
连接和会话
连接是在客户端进程和数据库实例之间的一条物理通信路径。
在连接过程中,通信路径使用可用的进程间通信机制或网络软件来建立。通常,连接在客户端进程和服务器进程(或调度器进程)之间产生,但它也可以在客户端进程与 Oracle 连接管理器(CMAN)之间产生。
会话是数据库实例内存中的一个逻辑实体,表示登录到数据库的某个当前用户的状态。例如,当用户使用密码通过了数据库身份验证时,会为此用户建立一个会话。会话的持续时间从用户通过数据库验证开始,直到用户断开连接,或退出数据库应用程序。
在单个连接之上,可以建立 0 个、1 个、或多个会话。这些会话相互独立:一个会话中的事务提交并不会影响其他会话中的事务。
单个数据库用户可能会同时运行多个会话。如下图所示,hr 用户可能具有到数据库的多个连接。对于专用服务器连接,数据库为每个连接创建一个服务器进程。只有导致创建该专用服务器进程的客户端进程才能使用它。对于共享服务器连接,由多个客户端进程访问单个共享服务器进程。

如图 15-3 所示,hr 用户仅有一个单一数据库连接,但此连接有两个会话。

生成一个 SQL 语句执行统计信息的自动跟踪报告,将再现图 15-3 中的场景。
示例 15-2 中的 DISCONNECT 命令实际上结束了会话,而未中断连接。
例 15-2 链接和会话
如下示例使用 SYSTEM 用户从 SQL*Plus 连接到数据库,并启用跟踪,从而创建一个新的会话(包括示例输出)。
SQL> SELECT SID, SERIAL#, PADDR FROM V$SESSION WHERE USERNAME = USER;
SID SERIAL# PADDR
--- ------- --------
90 91 3BE2E41C
SQL> SET AUTOTRACE ON STATISTICS;
SQL> SELECT SID, SERIAL#, PADDR FROM V$SESSION WHERE USERNAME = USER;
SID SERIAL# PADDR
--- ------- --------
88 93 3BE2E41C
90 91 3BE2E41C
...
SQL> DISCONNECT
DISCONNECT 命令实际上只是结束了会话,而未中断连接。打开一个新的终端并以一个不同的用户连接到实例,如下查询显示地址为 3BE2E41C 的连接仍然处于活动状态。
SQL> CONNECT dba1@inst1
Password: ********
Connected.
SQL> SELECT PROGRAM FROM V$PROCESS WHERE ADDR = HEXTORAW('3BE2E41C');
PROGRAM
------------------------------------------------
oracle@stbcs09-1 (TNS V1-V3)
数据库操作
在数据库监控上下文中,数据库操作是最终用户或应用程序代码定义的两个时间点之间的会话活动。
一个简单的数据库操作要么是一个 SQL 语句,要么是一个 PL/SQL 过程或函数。复合数据库操作是一组单个或复合操作。
要监控、比较和调优任务,可以将大量任务划分为数据库操作,并将操作细分为阶段。用例是一个 PL/SQL 批处理作业,它的运行速度比正常情况下要慢。通过将作业配置为数据库操作,您可以识别和调优作业中的昂贵步骤。
数据库操作的每次执行都由一对属性惟一地标识:操作名称和执行 ID。一个会话可以通过指定其会话 ID 和序列号在不同的会话中启动或停止数据库操作。
同一数据库操作的两次出现可以使用相同的名称但不同的执行 id 同时执行。具有相同名称的数据库操作的每次执行都可以包含不同的语句。
使用 DBMS_SQL_MONITOR PL/SQL 包创建和管理数据库操作。可以使用 V$SQL_MONITOR、V$SQL_PLAN_MONITOR 和 V$SQL_MONITOR_SESSTAT 监控操作。
服务器进程概述
Oracle 数据库创建服务器进程,以处理连接到实例的客户端进程的请求。客户端进程总是通过单独的服务器进程与数据库进行通信。
为某个数据库应用程序创建的服务器进程,可以执行一个或多个下列任务:
- 解析并运行通过应用程序发出的 SQL 语句,包括创建和执行查询计划
- 执行 PL/SQL 代码
- 将数据块从数据文件读入数据库缓冲区高速缓存(将已修改的块写回磁盘是 DBWn 后台进程的任务)
- 返回结果信息,以便应用程序可以进一步处理
专用服务器进程
对于专用服务器连接,客户端连接与一个且仅与一个服务器进程相关联。
在 Linux 上,连接到一个数据库实例的 20 个客户端进程,有相应的 20 个服务器进程为其提供服务。在会话期间,此服务器进程专用于其客户端进程。服务器进程将特定于进程的信息和 UGA 存储在其 PGA 中。
共享服务器进程
对于共享服务器连接,客户端应用程序通过网络连接到一个调度器进程,而不是一个服务器进程。例如,20 个客户端进程可能会仅连接到一个单一的调度器进程。
调度器进程接收来自已连接客户端的请求,并将它们放入大池中的请求队列。第一个可用的共享服务器进程从队列承接一个请求并处理之。之后,共享服务器进程将结果放回调度器响应队列。调度器进程会监视此队列,并将结果传回客户端。
与专用服务器进程类似,共享服务器进程也有其自己的 PGA。但是,会话的 UGA 位于 SGA 中,以便任何共享服务器进程可以访问其中的会话数据。
Oracle 数据库如何创建服务器进程
数据库根据连接方法以各种方式创建服务器进程。
连接方法如下:
- bequeath
SQL*Plus、OCI 客户机或其他客户机应用程序直接生成服务器进程。 - Oracle 网络监听
客户机应用程序通过监听连接到数据库。 - 专门的代理
这是一个创建前台进程的数据库进程。与监听不同,代理驻留在数据库实例中。当使用专用代理时,客户机连接到监听,然后监听将连接传递给专用代理。
当连接不使用 bequeath 时,数据库创建服务器进程如下:
- 客户机应用程序从监听或代理请求一个新连接。
- 监听或代理启动新进程或线程的创建。
- 操作系统创建新进程或线程。
- Oracle 数据库初始化各种组件和通知。
- 数据库移交连接和特定于连接的代码。
如果使用专用代理连接方法,则可以使用 DBMS_PROCESS 包预先创建服务器进程池。在这种情况下,Process Manager (PMAN)后台进程监视预先创建的进程池,这些进程等待与客户机请求关联。当连接需要服务器进程时,数据库跳过创建进程的步骤 2~4,只执行步骤 5。这种优化提高了性能。
后台进程概述
后台进程是多进程 Oracle 数据库使用的其他进程。后台进程执行操作数据库所需的维护任务,并最大化多用户性能。
每个后台进程都有其单独的任务,但又与其他进程相互协作。例如,LGWR 进程将重做日志缓冲区中的数据写入到联机重做日志。当已填充的日志文件将被存档时,LGWR 通知另一个进程来归档该文件。
数据库实例启动时,Oracle 数据库将自动创建后台进程。实例可能会有许多后台进程,但并不是所有这些进程在每种数据库配置中都存在。以下查询列出了在您的数据库上运行的后台进程:
SELECT PNAME
FROM V$PROCESS
WHERE PNAME IS NOT NULL
ORDER BY PNAME;
强制性后台进程
强制性后台进程存在于所有典型的数据库配置。
默认情况下,这些进程运行在以一个最小化配置的初始化参数文件启动的数据库实例中。只读数据库实例禁用其中一些进程。
进程监视器进程(PMON)组
PMON 组包括 PMON、清理主进程(CLMN)和清理辅助进程(CLnn)。这些流程负责监视和清理其他流程。
PMON 组监视缓冲区缓存的清理和客户机进程使用的资源的释放。例如,PMON 组负责重置活动事务表的状态,释放不再需要的锁,并从活动进程列表中删除终止进程的进程 ID。
数据库必须确保已终止进程所持有的资源已被释放,以便其他进程可以使用它们。否则,进程可能会阻塞或陷入争用。
进程监视器进程
进程监视器(PMON)检测其他后台进程的终止。如果服务器或调度程序进程非正常终止,则 PMON 组负责执行进程恢复。进程终止可能有多个原因,包括操作系统 kill 命令或 ALTER SYSTEM KILL SESSION 语句。
清理主进程(CLMN)
PMON 将清理工作委托给清理主进程(CLMN)。检测异常终止的任务仍然由 PMON 来完成。
CLMN 定期对已终止的进程、已终止的会话、事务、网络连接、空闲会话、分离事务和已超过空闲超时的分离网络连接进行清理。
清理辅助进程(CLnn)
CLMN 将清理工作委托给 CLnn 辅助进程。
CLnn 进程帮助清理终止的进程和会话。辅助进程的数量与要做的清理工作的数量和当前清理的效率成正比。
清理进程可能被阻塞,从而阻止它继续清理其他进程。此外,如果多个进程需要清理,那么清理时间可能很长。由于这些原因,Oracle 数据库可以同时使用多个 helper 进程来执行清理,从而减轻了缓慢的性能。
V$CLEANUP_PROCESS 和 V$DEAD_CLEANUP 视图包含关于 CLMN 清理的元数据。V$CLEANUP_PROCESS 视图为每个清理进程包含一行。例如,如果V$CLEANUP_PROCESS.STATE 是 BUSY,则进程当前正在进行清理。
数据库资源隔离
如果进程或会话终止,则 PMON 组将所持有的资源释放给数据库。在某些情况下,PMON 组可以自动隔离损坏的、不可恢复的资源,这样就不会立即强制终止数据库实例。
PMON 组继续对持有隔离资源的进程或会话执行尽可能多的清理。V$QUARANTINE 视图包含元数据,比如资源的类型、消耗的内存数量、导致隔离的 Oracle 错误等等。
Process Manager (PMAN)
Process Manager (PMAN) 监视多个后台进程,包括共享服务器、池服务器和作业队列进程。
PMAN 监视、生成和停止以下类型的进程:
- 调度程序和共享服务器进程
- 数据库驻留连接池的连接代理和池服务器进程
- 工作队列进程
- 可重新开始的后台进程
监听注册进程(LREG)
监听注册进程(LREG)使用 Oracle 网络监听注册关于数据库实例和调度程序进程的信息。
当实例启动时,LREG 轮询监听以确定它是否正在运行。如果监听正在运行,则 LREG 将传递相关参数。如果它不运行,那么 LREG 会定期尝试与它联系。
系统监视器进程(SMON)
系统监视器进程(SMON)负责各种系统级清理职责。
分配给 SMON 的职责包括:
- 如有必要,在实例启动时执行实例恢复。在 Oracle RAC 数据库中,一个数据库实例的 SMON 进程可以为另一个失败的实例执行实例恢复。
- 在实例恢复期间,由于读文件或表空间脱机错误而跳过的已终止事务,由 SMON 进行恢复。当表空间或文件重新联机时,SMON 将恢复该事务。
- 清理未使用的临时段。例如,Oracle 数据库在创建索引时会分配扩展区。如果操作失败,则 SMON 会清理临时空间。
- 合并在字典管理的表空间中的多个连续空闲扩展区。
SMON 定期检查是否需要做什么。其他进程在发现需要做什么时,也可以调用 SMON 来做。
数据库写入器进程(DBW)
数据库写入器进程(DBW)将数据库缓冲区的内容写入到数据文件中。DBW 进程将数据库缓存中被修改的缓冲区写入到磁盘中。
虽然一个数据库写入进程(DBW0)对于大多数系统来说已经足够,但如果您的系统大量修改数据,您也可以配置额外的写入器进程——从 DBW1 到 DBW9,从 DBWa 到 DBWj 和 从 BW36 到 BW99——来提高写入性能。这些额外的 DBWn进程在单处理器系统上用处不大。
DBW 进程在下列条件下会将脏缓冲区写入到磁盘:
- 当服务器进程扫描了额定数目的缓冲区后,仍未找到干净的可重复使用的缓冲区时,它会通知 DBW 执行写入操作。DBW 尽可能以异步方式将脏缓冲区写入到磁盘,以便同时能执行其他处理。
- DBW 周期性地写出缓冲区,以推进检查点,该点是重做线程中实例恢复开始的位置。检查点的日志位置由在缓冲区高速缓存中最老的脏缓冲区确定。
在许多情况下,DBW 写入的块将遍布整个磁盘。因此,该写操作往往要比由 LGWR 执行的顺序写入速度慢。DBWn 进程尽可能进行多块写入,以提高效率。多块写入的数据块数量因操作系统而异。
日志写入器进程(LGWR)
日志写入器进程(LGWR)管理重做日志缓冲区。
LGWR 将缓冲区中的一个连续部分写入联机重做日志。通过分离各种修改数据库缓冲区任务,将脏缓冲区分散写入到磁盘,而将重做缓冲区顺序写入到磁盘,提高了数据库性能。
在以下的情况下,LGWR 将自上次最后写入以来,复制到缓冲区的所有重做条目写入联机重做日志:
- 用户提交了事务。
- 发生了在线重做日志切换。
- 自 LGWR 最后一次写入到现在超过了三秒。
- 重做日志缓冲区已达到三分之一满,或包含 1 MB 以上被缓冲的数据。
- DBW 必须将修改的缓冲区写入到磁盘。
在 DBW 可以将脏缓冲区写到磁盘之前,与该缓冲区更改相关联的重做记录必须先被写入磁盘(预写协议)。如果 DBW 发现一些重做记录尚未写入,则它通知 LGWR 将记录写入磁盘,并等待 LGWR 完成此工作,然后 DBW 才将数据缓冲区写入磁盘。
LGWR 与提交
Oracle 数据库使用快速提交机制来提高已提交事务的性能。
当用户发出 COMMIT 语句时,事务分配到一个系统更改号 (SCN)。LGWR 将一个提交记录记入重做日志缓冲区,连同提交 SCN 和事务的重做条目,并立即写入到磁盘。
重做日志缓冲区是循环的。当 LGWR 将重做条目从重做日志缓冲区写入到联机重做日志文件时,服务器进程可以复制新条目并覆盖已写入到磁盘的重做日志缓冲区中的条目。通常 LGWR 的写入速度足够快,以确保在缓冲区中总会有可用空间供新条目使用,即使对联机重做日志的访问很繁重时也是如此。
包含事务提交记录的重做条目的原子写入,是确定该事务已提交的唯一事件。Oracle 数据库向已提交事务返回一个成功代码,虽然数据缓冲区尚未写入到磁盘。对数据块的相应更改被延迟,直到 DBWn 在某个有利的时机将它们写到数据文件。
当事务活动很高时,LGWR 可能会使用组提交。例如,某个用户提交其事务,导致 LGWR 将事务的重做条目写入到磁盘。在此写操作的过程中,其他用户也试图提交。但 LGWR 无法写入磁盘以提交这些事务,直到前面的写入完成为止。完成后, LGWR 可以将(尚未提交的)等待事务中的重做条目列表在一个操作中全部写入。通过这种方式,数据库最小化了磁盘 I/O,而最大化了性能。如果提交请求继续维持在一个高的水平,则每个 LGWR 写入操作都可能包含多个提交记录。
LGWR 和无法访问的文件
LGWR 同步写入联机重做日志文件组的所有活动镜像。
如果某个日志文件不可访问,则 LGWR 继续写入组中的其他文件,并在 LGWR 跟踪文件和警报日志中记录一个错误。如果组中的所有文件都损坏,或者如果因为尚未存档而不可用,则 LGWR 不能继续工作。
检查点进程(CKPT)
检查点进程 (CKPT) 使用检查点信息更新控制文件和数据文件头,并通知 DBWn 将块写入磁盘。检查点信息包括检查点位置、SCN、联机重做日志中的起始恢复位置。
如图 15-4 所示,CKPT 不会将数据块写入数据文件,也不会将重做块写入联机重做日志文件。

可管理性监视器进程(MMON 和 MMNL)
可管理性监视器进程(MMON)执行许多与自动工作负载存储库(AWR)相关的任务。
例如,当某个度量超出其阈值时,MMON 会写入信息,并拍摄快照,捕获最近修改的 SQL 对象的统计信息。
可管理性监视器轻量进程(MMNL)将 SGA 中的活动会话历史 (ASH) 缓冲区统计信息写入磁盘。当 ASH 缓冲区已满时,MMNL 将其写入到磁盘。
恢复器进程(RECO)
在一个分布式数据库中,恢复器进程(RECO)会自动解决在分布式事务中的故障。
一个节点的 RECO 进程会自动连接到可疑分布式事务中涉及的其他数据库。当 RECO 数据库之间重新建立了连接后,它会自动解决所有可疑事务,从每个数据库事务表中删除任何与可疑事务对应的未决事务行。
可选后台进程
可选后台进程即是未定义为强制性的后台进程。
大多数可选后台进程是特定于任务或功能特性的。例如,支持Oracle ASM的后台进程,只有在启用这个功能时才可用。
归档器进程(ARCn)
重做日志切换发生后,归档器进程(ARCn)将联机重做日志文件复制到脱机存储。
这些进程也可能会收集事务重做数据,并将其传送到备用数据库目标位置。仅当数据库处于归档模式下且启用了自动归档时,才存在 ARCn 进程。
作业队列进程(CJQ0 和 Jnnn)
作业队列进程来运行用户作业,通常使用批处理模式。作业是一种用户定义的被计划运行一次或多次的任务。
例如,您可以使用作业队列来计划一个在后台长时间运行的更新任务。给定一个开始日期和时间间隔,作业队列进程尝试在下一个间隔重新运行该作业。
Oracle 数据库动态管理作业队列进程,以使作业队列客户端在需要时能使用更多作业队列进程。当这些新启动的进程处于空闲状态时,数据库会释放其资源。
动态作业队列进程可能会在某个给定的时间间隔同时运行大量的作业。事件的顺序如下所示:
- Oracle 调度器根据需要会自动启动和停止作业协调器进程 (CJQ0)。协调器进程定期从系统表 JOB$ 中选择需要运行的作业。被选出的新作业是按时间排序的。
- 协调器进程动态派生出作业队列从属进程 (Jnnn) 来运行作业。
- 作业队列进程运行由 CJQ0 进程选出以备执行的某个作业。每个作业队列进程一次运行一个作业直至完成。
- 在进程完成单个作业的执行后,它会轮询以运行更多工作。如果没有计划的作业可供执行,则它进入睡眠状态,且周期性地醒来再次轮询以运行更多工作。如果该进程未找到任何新的作业,则它在一个预设的时间间隔后会终止。
初始化参数 JOB_QUEUE_PROCESSES 表示在实例上可以同时运行的作业队列进程的最大数目。然而,客户端不应假定所有作业队列进程都可用于执行作业。
闪回数据存档器进程(FBDA)
闪回数据归档器进程(FBDA)将跟踪表的历史行归档到闪回数据归档区。
当跟踪表中包含 DML 的事务提交时,该进程将行的前像存储到闪回数据存档区。它也会保存当前行上的元数据。
FBDA 自动管理闪回数据存档的空间、组织和保留期等。此外,该进程会跟踪被跟踪的事务归档已发生了多久。
空间管理协调器进程 (SMCO)
SMCO 进程协调各种空间管理相关的任务。
通常任务包括主动预防性的空间分配和空间回收。SMCO 动态生成从属进程(Wnnn)来执行此任务。
从属进程
从属进程是为其他进程执行工作的后台进程。
本部分介绍一些 Oracle 数据库使用的从属进程。
I/O 从属进程
I/O 从属进程(Innn)为不支持异步 I/O 的系统和设备模拟异步 I/O。
异步的 I/O 没有传输时间要求,使其他进程可以在完成传输之前就可以开始。
例如,假定应用程序在一个不支持异步 I/O 的操作系统上写入 1000 个块到磁盘。每次写入都是顺序发生的,并等待一个写操作已成功的确认。而对于异步磁盘,应用程序可以大容量写入数据块,并在等待操作系统确认写入完的同时执行其他工作。
为模拟异步 I/O,由一个进程监督几个从属进程。调用者进程将工作分配给每个从属进程,从属进程会等待每个写操作完成,并在完成后报告调用者。在真正的异步 I/O 中,操作系统会等待 I/O 完成,并在完成时报告主进程,而在模拟异步 I/O 中,从属进程会等待,并在完成时报告调用者。
数据库支持包括以下不同类型的 I/O 从属进程:
- 恢复管理器 (RMAN) 的 I/O 从属进程
当使用 RMAN 备份或还原数据时,您可以为磁盘和磁带设备使用 I/O 从属进程。 - 数据库写入器从属进程
如果计算机只有一个 CPU,则数据库使用多个写入器进程并不现实,此时数据库可以通过多个从属进程来分布 I/O。DBWR 是扫描缓冲区高速缓存 LRU 列表中的块以写入到磁盘的唯一进程。而 I/O 从属进程为这些块执行 I/O。
并行查询 (PX) 服务进程
在并行执行中,多个进程同时协作,来运行一个单一 SQL 语句。
通过在多个进程之间分配工作,Oracle 数据库可以更快地运行语句。例如,四个进程分别处理一年中四个不同的季度,而不是由一个进程处理所有四个季度。
并行执行与串行执行形成对比,在串行执行中,单个服务器进程执行 SQL 语句顺序执行所需的所有处理。例如,要执行完整的表扫描,例如 SELECT * FROM employees,一个服务器进程执行所有的工作,如图 15-5 所示。

并行执行减少了在大型数据库(如数据仓库)上的数据密集型操作的响应时间。对称多处理 (SMP) 和集群系统能从并行执行获得最大的性能优势,因为语句处理可以在多个 CPU 之间划分。并行执行也可以使某些类型的 OLTP 和混合系统受益。
在 Oracle RAC 系统中,由特定服务的服务配置控制并行执行。具体而言,并行进程在已配置服务的多个节点上运行。默认情况下,Oracle 数据库只在提供数据库连接服务的实例上运行并行进程。这并不影响其他并行操作,如并行恢复或对 GV$ 查询的处理。
查询协调器
在并行执行中,服务器进程充当查询协调器(也称为并行执行协调器)。
查询协调器负责以下工作:
- 解析查询
- 分配和控制并行执行服务器进程
- 向用户发送输出
给定查询的查询计划,协调器将 SQL 查询中的每个操作符分解为多个并行块,按照查询中指定的顺序运行它们,并集成执行操作符的并行执行服务器生成的部分结果。
分配给单个操作的并行执行服务器的数量是一个操作的并行度。同一 SQL 语句中的多个操作都具有相同的并行度。
Producers 和 Consumers
并行执行服务器分为 producers 和 consumers。consumers 负责处理他们的数据,然后将其分发给需要它的 consumers。
数据库可以使用多种技术执行分发。两种常见的技术是广播和哈希。在广播中,每个 producer 将行发送给所有 consumers。在哈希中,数据库对一组键计算哈希函数,并使每个 consumer 负责哈希值的子集。
图 15-6 表示 producers 和 consumers 在并行执行以下语句时的相互作用:
SELECT * FROM employees ORDER BY last_name;
执行计划实现对 employees 表的完整扫描。扫描之后是检索到的行。扫描操作中涉及的所有 producer 进程都将行发送到执行排序的适当 consumers 进程。

颗粒
在并行执行中,表被动态划分成多个称为颗粒的加载单元,是访问数据时最小的工作单元。
一个基于块的颗粒是一个由单个并行执行服务器读取的数据块范围(也称为 PX 服务器),其名 称格式为 Pnnn。为了在并行服务器进程之间获得工作的均匀分布,颗粒的数量总是远远高于所请求的 DOP。
图 15-7 显示了在 employees 表上的并行扫描。

数据库在执行时将颗粒映射到执行服务器。当一个执行服务器完成对某个颗粒对应行的读取,而此时还有其它颗粒要读取时,该执行服务器从协调器获取另一个颗粒。此操作将继续,直到读取完整个表。执行服务器向协调器发送执行结果,协调器再将这些片断合并成最终所需的全表扫描结果。




