Oracle 20C官方文档-Concepts(Part V-3)
Oracle® Database
Database Concepts
Part I Oracle Relational Data Structures
Part II Oracle Data Access
Part III Oracle Transaction Management
Part IV Oracle Database Storage Structures
Part V Oracle Instance Architecture
---1 Oracle Database Instance
---2 Memory Architecture
---3 Process Architecture
---4 Application and Oracle Net Services Architecture

15 进程结构
Process Architecture
本章讨论Oracle数据库中的进程。本章包括以下章节:
•进程介绍
•客户端进程概述
•服务器进程概述
•后台进程概述
进程介绍
流程是操作系统中可以运行一系列步骤的机制。
流程执行架构依赖于操作系统。例如,在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数据库)使用多个进程来运行Oracle数据库代码的不同部分,并为用户提供额外的Oracle进程——每个连接的用户使用一个进程,或者多个用户共享一个或多个进程。
大多数数据库是多用户的,因为数据库的主要优点是同时管理多个用户所需的数据。数据库实例中的每个进程执行特定的任务。通过将数据库和应用程序的工作划分为多个进程,多个用户和应用程序可以同时连接到一个实例,同时系统可以提供良好的性能。
在Oracle Database 12c之前的版本中,Oracle进程没有在UNIX和Linux系统上作为线程运行。从Oracle Database 12c开始,多线程Oracle数据库模型允许Oracle进程作为操作系统线程在单独的地址空间中执行。安装Oracle数据库12c时,数据库以进程模式运行。必须将THREADED_EXECUTION初始化参数设置为TRUE才能在线程模式下运行数据库。在线程模式下,UNIX和Linux上的一些后台进程作为进程运行(每个进程包含一个线程),而其余的Oracle进程作为进程中的线程运行。
在以线程模式运行的数据库中,PMON和DBW可能作为操作系统进程运行,而LGWR和CMON可能作为单个进程中的线程运行。两个前台进程和一个并行执行(PX)服务器进程可以作为第二个操作系统进程中的线程运行。第三个操作系统进程可能包含多个前台线程。因此,“Oracle进程”并不总是意味着“操作系统进程”。
示例15-1查看Oracle流程元数据
V$PROCESS视图包含连接到数据库实例的每个Oracle进程的一行。例如,您可以在SQL*Plus中运行以下查询,以获得每个进程的操作系统进程ID和操作系统线程ID:

......
客户端流程概述
当用户运行一个应用程序(如Pro*C程序或SQL*Plus)时,操作系统创建一个客户端进程(有时称为用户进程)来运行用户应用程序。客户端应用程序将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客户端进程:

在数据库主机上,对sqlplus或sample进程的搜索显示一个具有非本地连接的服务器进程,但是没有客户机进程:

连接和会话
数据库连接是客户机进程和数据库实例之间的物理通信路径。
在连接期间,使用可用的进程间通信机制或网络软件建立通信路径。通常,连接发生在客户机进程和服务器进程或调度程序之间,但也可能发生在客户机进程和Oracle connection Manager (CMAN)之间。
数据库会话是数据库实例内存中的逻辑实体,它表示当前用户登录到数据库的状态。例如,当数据库使用密码对用户进行身份验证时,将为该用户建立一个会话。一个会话从用户通过数据库身份验证开始,一直持续到用户断开连接或退出数据库应用程序为止。
单个连接可以在其上建立0、1或多个会话。会话是独立的:一个会话中的提交不会影响其他会话中的事务。
对于单个数据库用户,多个会话可以并发存在。如下图所示,用户hr可以有多个到数据库的连接。在专用服务器连接中,数据库代表每个连接创建一个服务器进程。只有创建专用服务器的客户机进程才使用它。在共享服务器连接中,许多客户机进程访问单个共享服务器进程。

图15-3演示了一个案例,其中用户hr有一个到数据库的连接,但是这个连接有两个会话。

生成SQL语句执行统计信息的自动跟踪报告将重新创建图15-3中的场景。
例15-2中的DISCONNECT命令实际上结束了会话,而不是连接。
例15-2连接和会话
下面的示例将SQL*Plus作为用户系统连接到数据库,并启用跟踪,从而创建一个新会话(包括示例输出):


DISCONNECT命令实际上结束了会话,而不是连接。打开一个新终端并以另一个用户的身份连接到实例,下面的查询显示地址为3BE2E41C的连接仍然处于活动状态。

数据库操作
在数据库监控上下文中,数据库操作是最终用户或应用程序代码定义的两个时间点之间的会话活动。
简单的数据库操作可以是单个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代码
将数据块从数据文件读入数据库缓冲区缓存(DBW后台进程的任务是将修改后的块写回磁盘)
•以应用程序可以处理信息的方式返回结果。
共享服务器进程
在共享服务器连接中,客户机应用程序通过网络连接到dispatcher进程,而不是服务器进程。例如,20个客户端进程可以连接到单个dispatcher进程。
dispatcher进程接收来自连接的客户机的请求,并将它们放入大池中的请求队列中。第一个可用的共享服务器进程从队列获取请求并处理它。然后,共享服务器将结果放入dispatcher响应队列。dispatcher进程监视此队列并将结果传输到客户机。
与专用服务器进程一样,共享服务器进程也有自己的PGA。但是,会话的UGA在SGA中,因此任何共享服务器都可以访问会话数据。
Oracle数据库如何创建服务器进程
数据库根据连接方法以各种方式创建服务器进程。
连接方法如下:
•遗赠Bequeath
一个OCI客户机或另一个客户机应用程序直接生成服务器进程。
•Oracle Net listener
客户机应用程序通过侦听器连接到数据库。
•专用的代理Dedicated broker
这是一个创建前台进程的数据库进程。与侦听器不同,代理驻留在数据库实例中。当使用专用代理时,客户机连接到侦听器,然后侦听器将连接传递给专用代理。
当连接不使用bequeath时,数据库创建服务器进程如下:
1.客户端应用程序从侦听器或代理请求新连接。
2.侦听器或代理启动新进程或线程的创建。
3.操作系统创建新进程或线程。
4.Oracle数据库初始化各种组件和通知。
5.数据库移交连接和特定于连接的代码。
如果使用专用代理连接方法,则可以使用DBMS_PROCESS包预先创建服务器进程池。在这种情况下,Process Manager (PMAN)后台进程监视预先创建的进程池,这些进程等待与客户机请求相关联。当连接需要服务器进程时,数据库跳过创建进程的步骤2-4,只执行步骤5。这种优化提高了性能。
后台进程概述
后台进程是多进程Oracle数据库使用的附加进程。后台进程执行操作数据库所需的维护任务,并为多个用户实现性能最大化。
每个后台进程有一个单独的任务,但是可以与其他进程一起工作。例如,LGWR进程将数据从重做日志缓冲区写入在线重做日志。当一个已填满的重做日志文件准备归档时,LGWR向另一个进程发出信号,让它归档重做日志文件。
Oracle数据库在数据库实例启动时自动创建后台进程。一个实例可以有许多后台进程,但并不是所有后台进程都始终存在于每个数据库配置中。下面的查询列出了在你的数据库上运行的后台进程:
SELECT PNAME FROMV$PROCESS WHERE PNAME IS NOT NULL ORDER BY PNAME;
本节包括以下主题:
•强制后台进程
•可选的后台进程
•Slave后台进程
强制后台进程
在所有典型的数据库配置中都存在强制的后台进程。
这些进程在默认情况下在一个读/写数据库实例中运行,该实例由一个最低配置的初始化参数文件启动。只读数据库实例禁用其中一些进程。
本节介绍以下强制性的后台流程:
•进程监控进程(PMON)组
•进程管理器(PMAN)
•监听器注册流程(LREG)
•系统监控流程(SMON)
•数据库写入过程(DBW)
•日志写入过程(LGWR)
•检查点过程(CKPT)
•可管理性监控流程(MMON和MMNL)
•回收器进程(RECO)
进程监视器进程(PMON)组
PMON组包括PMON、清理主进程(CLMN)和清理辅助进程(CLnn)。这些进程负责监视和清理其他进程。
PMON组监视缓冲区缓存的清理和客户机进程使用的资源的释放。例如,PMON组负责重置活动事务表的状态,释放不再需要的锁,并从活动进程列表中删除终止进程的进程ID。
数据库必须确保已终止进程持有的资源被释放,以便其他进程可以使用它们。否则,进程可能会被阻塞或卡在争用中。
进程监视器进程(PMON)
进程监视器(PMON)检测其他后台进程的终止。如果服务器或调度程序进程非正常终止,则PMON组负责执行进程恢复。进程终止可能有多个原因,包括操作系统终止命令或更改系统终止会话语句。
清理主进程(CLMN)
PMON将清理工作委托给清理主进程(CLMN)。检测异常终止的任务仍然由PMON完成。
CLMN定期执行已终止进程、已终止的会话、事务、网络连接、空闲会话、分离事务和已超出其空闲超时的分离网络连接的清理。
清理辅助进程(CLnn)
CLMN将清理工作委托给CLnn辅助进程。
CLnn进程帮助清除终止的进程和会话。辅助进程的数量与要完成的清理工作量和当前清理效率成正比。
清理进程可能被阻塞,从而阻止它继续清理其他进程。此外,如果多个进程需要清理,那么清理时间可能很长。由于这些原因,Oracle数据库可以并行地使用多个辅助进程来执行清理,从而缓解了缓慢的性能。
V$CLEANUP_PROCESS和V$DEAD_CLEANUP视图包含关于CLMN清理的元数据。V$CLEANUP_PROCESS视图包含每个清理进程的一行。例如,如果V$CLEANUP_PROCESS。状态繁忙,则进程当前正在进行清理。
数据库资源隔离
如果进程或会话终止,则PMON组将所持有的资源释放到数据库。在某些情况下,PMON组可以自动隔离损坏的、不可恢复的资源,这样就不会立即强制终止数据库实例。
PMON组将继续对持有隔离资源的进程或会话执行尽可能多的清理工作。V$QUARANTINE视图包含元数据,比如资源类型、消耗的内存数量、导致隔离的Oracle错误等等。
进程管理器(PMAN)
Process Manager (PMAN)监视多个后台进程,包括共享服务器、池服务器和作业队列进程。
PMAN监视、生成和停止以下类型的进程:
•调度程序和共享服务器进程
•用于数据库常驻连接池的连接代理和池服务器进程
•工作队列的过程
•可重新起动的后台进程
监听器注册进程(LREG)
12C之前是由pmon进程负责监听器注册,12C开始引入LREG进程
侦听器注册进程(LREG)向Oracle Net侦听器注册关于数据库实例和调度程序进程的信息。
当实例启动时,LREG轮询侦听器以确定它是否正在运行。如果监听器正在运行,那么LREG将传递相关参数。如果它没有运行,那么LREG会定期尝试与它联系。
系统监控进程(SMON)
系统监控进程(SMON)负责各种系统级的清理任务。
分配给SMON的职责包括:
•执行实例恢复,如果需要,在实例启动时执行。在Oracle RAC数据库中,一个数据库实例的SMON进程可以对失败的实例执行实例恢复。
•恢复在实例恢复期间由于文件读取或表空间离线错误而跳过的已终止事务。当表空间或文件恢复联机时,SMON将恢复事务。
•清理未使用的临时段。例如,Oracle数据库在创建索引时分配区段。如果操作失败,那么SMON将清理临时空间。
•在字典管理的表空间中合并连续的空闲区。
SMON定期检查,看看是否需要它。如果其他进程检测到需要SMON,则可以调用它。
数据库写进程(DBW)
数据库写入进程(DBW)将数据库缓冲区的内容写入数据文件。DBW进程将数据库缓冲区缓存中的修改缓冲区写入磁盘。
尽管一个数据库写入进程(DBW0)对于大多数系统来说已经足够了,但是您可以配置其他进程—dbw1到DBW9, DBWa到DBWz, BW36到bw99—如果您的系统大量修改数据,那么可以提高写入性能。这些附加的DBW进程在单处理器系统上没有用处。
DBW进程在下列条件下将脏缓冲区写入磁盘:
•当服务器进程在扫描缓冲区的阈值数目后找不到干净的可重用缓冲区时,它向DBW发出写的信号。DBW在执行其他处理时,尽可能异步地将脏缓冲区写入磁盘。
•DBW定期写缓冲区来推进检查点,检查点是重做线程中实例恢复开始的位置。检查点的日志位置由缓冲区缓存中最老的脏缓冲区决定。
在许多情况下,DBW写的块分散在整个磁盘中。因此,写操作往往比LGWR执行的顺序写操作慢。DBW在可能的情况下执行多块写操作以提高效率。在多块写入中写入的块的数量因操作系统而异。
日志写进程(LGWR)
日志写程序(LGWR)管理在线重做日志缓冲区。
LGWR将缓冲区的一部分写入在线重做日志。通过将修改数据库缓冲区的任务分开,将脏缓冲区执行分散的写操作到磁盘,以及将重做的快速顺序写操作执行到磁盘,数据库可以提高性能。
在以下情况下,LGWR将上次写入后复制到缓冲区中的所有重做条目执行写入:
•用户提交事务。
•发生在线重做日志切换。
•LGWR上次写已经过去三秒钟了。
•重做日志缓冲区已满三分之一,或包含1 MB的缓冲数据。
•DBW必须将修改后的缓冲区写入磁盘。
在DBW可以写入脏缓冲区之前,数据库必须将与缓冲区更改相关的重做记录写入磁盘(write-ahead协议)。如果DBW发现某些重做记录没有被写入,它将向LGWR发出将这些记录写入磁盘的信号,并在将数据缓冲区写入磁盘之前等待LGWR完成。
LGWR和提交
Oracle数据库使用快速提交机制来提高提交事务的性能。
当用户发出COMMIT语句时,事务被分配一个系统更改号(SCN)。LGWR将提交记录放入重做日志缓冲区中,并立即将其写入磁盘,同时提交SCN和事务的重做项。
重做日志缓冲区是循环的。当LGWR将重做日志缓冲区中的重做条目写入在线重做日志文件时,服务器进程可以将新条目复制到已写入磁盘的重做日志缓冲区中的条目之上。LGWR通常写得足够快,以确保缓冲区中始终有空间供新条目使用,即使在线重做日志的访问很繁重。
包含事务提交记录的重做条目的原子写是确定事务已提交的单个事件。Oracle数据库向提交事务返回一个成功代码,尽管数据缓冲区还没有写到磁盘上。对数据块的相应更改将延迟到DBW能够有效地将它们写入数据文件之后。
当频繁提交时,LGWR可以使用组提交。例如,用户提交,导致LGWR将事务的重做项写入磁盘。在此期间,其他用户提交。LGWR在前一次写操作完成之前,不能向磁盘提交这些事务。完成后,LGWR可以在一个操作中写入等待事务(尚未提交)的重做条目列表。通过这种方式,数据库最小化了磁盘I/O并最大化了性能。如果提交请求以较高的速率继续,那么LGWR的每次写操作都可以包含多条提交记录。
LGWR和不可访问的文件
LGWR同步地写入同一日志组中多个日志成员。
如果日志文件不可访问,那么LGWR将继续向组中的其他成员文件写入,并向LGWR跟踪文件和警报日志写入错误。如果一个组中的所有成员文件都损坏了,或者这个组因为没有存档而不可用,那么LGWR就不能继续工作。
检查点进程(CKPT)
检查点进程(CKPT)使用检查点信息更新控制文件和数据文件头,并向DBW发送将块写入磁盘的信号。检查点信息包括检查点位置、SCN和开始恢复的在线重做日志中的位置。
如图15-4所示,CKPT不将数据块写入数据文件,也不将重做块写入在线重做日志文件。

可管理性监控进程(MMON和MMNL)
可管理性监视进程(mmon)执行许多与自动工作负载存储库(AWR)相关的任务。
例如,当某个度量值违反其阈值时,mmon会进行写入,为最近修改的SQL对象获取快照和统计值。
可管理性监视器精简进程(MMNL)将统计信息从SGA中的活动会话历史(ASH)缓冲区写入磁盘。MMNL在ASH缓冲区已满时写入磁盘。
回收器过程(RECO)
在分布式数据库中,recoverer进程(RECO)自动解决分布式事务中的故障。
节点的RECO进程自动连接到其他涉及到可疑分布式事务的数据库。当RECO重新建立数据库之间的连接时,它将自动解析所有可疑事务,从每个数据库的挂起事务表中删除与已解析事务对应的任何行。
可选的后台进程
可选的后台进程是指任何没有被定义为强制的后台进程。
大多数可选的后台进程都是特定于任务或特性的。例如,支持Oracle ASM的后台进程只有在启用该特性时才可用。
本节介绍一些常见的可选流程:
•归档进程(ARCn)
•作业队列处理进程(CJQ0和Jnnn)
•闪回归档 (FBDA)
•空间管理协调程序(SMCO)
归档进程(ARCn)
在发生重做日志切换后,归档进程(ARCn)将联机重做日志文件复制到脱机存储。
这些进程还可以收集事务重做数据并将其传输到备用数据库目的地。ARCn进程仅在数据库处于ARCHIVELOG模式并启用自动归档时才存在。
作业队列进程(CJQ0和Jnnn)
队列进程运行用户作业,通常是批处理模式。作业是计划运行一次或多次的用户定义任务。
例如,可以使用作业队列在后台调度长时间运行更新。给定一个开始日期和时间间隔,作业队列进程尝试在下一次出现该间隔时运行作业。
Oracle数据库动态管理作业队列进程,从而允许作业队列客户机在需要时使用更多的作业队列进程。当新进程空闲时,数据库释放它们所使用的资源。
动态作业队列进程可以在给定的时间间隔内并发地运行许多作业。事件的顺序如下:
1.作业队列进程(CJQ0)根据Oracle调度器的需要自动启动和停止。协调器进程定期从系统JOB$表中选择需要运行的作业。新选择的作业按时间排序。
2.协调器进程动态生成作业队列从属进程(Jnnn)来运行这些作业。
3.作业队列进程运行CJQ0进程为执行而选择的作业之一。每个作业队列进程一次运行一个作业。
4.流程执行完单个作业后,将轮询更多作业。如果没有计划执行作业,那么它将进入睡眠状态,然后定期从睡眠状态中醒来,并轮询更多的作业。如果进程没有找到任何新作业,那么它将在预设的时间间隔后终止。
初始化参数JOB_QUEUE_PROCESSES表示可以在实例上并发运行的作业队列进程的最大数量。但是,客户端不应该假设所有的作业队列进程都可用于作业执行。
注意:
如果初始化参数JOB_QUEUE_PROCESSES设置为0表示未启动协调器进程。
闪回归档进程(FBDA)
闪回数据归档进程,归档被追踪的表的历史行到闪回数据归档文件里面。当在被追踪的表上面发生了dml事务的时候,这个进程存储行的前镜像到闪回数据归档里面。它同样保存当前行的元数据。
FBDA自动管理空间、组织和保留的Flashback数据存档。此外,该流程还跟踪已跟踪的事务存档的时间。
空间管理协调程序(SMCO)
SMCO进程协调各种空间管理相关任务的执行。
典型的任务包括主动分配空间和回收空间。SMCO动态生成从进程(Wnnn)来实现任务。
Slave进程
Slave进程是代表其他进程执行工作的后台进程。
本节描述Oracle数据库使用的一些从进程。
I / O slave的过程
I/O slave进程(Innn)模拟不支持异步I/O的系统和设备。
在异步I/O中,对传输没有时间要求,这使得其他进程可以在传输完成之前启动。
例如,假设一个应用程序向一个不支持异步I/O的操作系统的磁盘写入了1000个块。每次写操作都是按顺序发生的,并等待写操作成功的确认。使用异步磁盘,应用程序可以批量写入块并执行其他工作,同时等待已写入所有块的操作系统的响应。
为了模拟异步I/O,一个进程监视多个从属进程。调用程序进程将工作分配给每个从属进程,它们等待每次写入完成并在完成后向调用程序报告。
在真正的异步I/O中,操作系统等待I/O完成并向流程报告,而在模拟异步I/O中,从操作系统等待并向调用者报告。
数据库支持不同类型的I/O slave,包括:
•恢复管理器(RMAN)的I/O奴隶
在使用RMAN备份或恢复数据时,可以对磁盘和磁带设备使用I/O从设备。
•Database writer slaves
当计算机有一个CPU时,无法使用多个数据库写进程,那么数据库可以将I/O分布在多个从进程上。DBW是惟一一个扫描缓冲区缓存LRU列表以查找要写到磁盘上的块的进程。但是,从I/O执行这些块的I/O。
并行执行(PX)服务器进程
在并行执行中,多个进程同时运行一条SQL语句。
通过将工作分配给多个进程,Oracle数据库可以更快地运行语句。例如,四个流程处理一年中四个不同的季度,而不是一个流程独自处理所有四个季度。
并行执行与串行执行形成对比,在串行执行中,单个服务器进程执行SQL语句的顺序执行所需的所有处理。例如,为了执行完整的表扫描,例如SELECT * FROM employees,一个服务器进程执行所有的工作,如图15-5所示。

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

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

数据库在执行时将颗粒映射到并行执行服务器。当并行执行服务器读取完与颗粒相对应的行后,当颗粒保留时,它从查询协调器获取另一个颗粒。此操作将继续,直到读取表为止。执行服务器将结果发送回协调器,协调器将这些片段组装到所需的完整表扫描中。





