1.oracle 工作模式
MTS模式:MTS(Multi-Threaded Server)。一个Dispatch进程专门处理处理Client Connection Request,进行排队,由后台多个Shared Server并行处理排队的请求。
可见:MTS模式下,进程和会话是一对多的关系
优点:在以不用增大物理内存的前提下支持更多的并发的连接。换句话说,如果你只有2G的物理内存,而你又想支持2000个连接,在获取最好性能的前提下,你就应该使用MTS模式
缺点:如果存在某个Client Request请求处理耗时过长,则整体处理效率就会下降。
Dedicated模式:会为每个Client Connection Request分配专门进程进行处理,所以该模式更适应于请求处理时间较长,请求数相对较少情况。
可见:Dedicate模式又叫专有模式,进程和会话是一对一关系
优点:1)每个用户都有一个连接,不至于有的应用占着连接造成别的客户的请求给挂起了;2)数据库处理性能较高。
缺点:1)内存管理上,此种模式随着用户连接数的增加而消耗更多的系统CPU与内存。因为随着连接数的增加,每增加一个连接,就要分配一份PGA,如果增加10000个连接,那就是10000个PGA要提供,内存很容易吃爆掉。而共享连接方式优点在于连接数。
查看v$session视图
SQL> select username,server,program from v$session where username is not null;
USERNAME SERVER PROGRAM
--------- --------- -------------------
GWM NONE
SYS SHARED plsqldev.exe
SYS SHARED plsqldev.exe --MTS模式
SYS DEDICATED sqlplus.exe --专用模式
注:以下内容将主要围绕专有模式进行讲解
2.PGA
PGA划分为多个不同的区域,每个区域都有不同的目的。如下图所示:

图中是专有服务器会话,当然不是所有PGA区域都会在所有案例中存在。
PGA主要包含两个部分Private SQL Area和 SQL Work Areas.
SQL Work Areas:包含了sort Area 、Hash Area、Bitmap Merge Area
Private SQL Area:包含了Persistent Area 、Runtime Area
2.1 Private SQL Area
当一个会话执行一个sql语句的时候,这个私有sql area 就会在pga中进行分配了。每个session都会有一个private sql area,如果不同session执行的同一个sql那么会指向同一个shared sql area(在SGA区)。
当一个服务进程执行SQL或PL/SQL代码,进程使用Private SQL Area来存储已解析的SQL语句相关的绑定变量、语句执行状态信息以及语句执行工作区域信息。

如上图:我们在进行dml以及ddl操作的时候隐含的都是打开cursor,每个游标都作为客户端一边指向服务端的一条指针,每个游标打开都会分配相应的private sql area。正因为CURSOR和私有SQL区域这样的相关性,所以两个术语经常互用。
注:一个连接,就会建立一个游标,也会创建一个session。
如上上图中所诉:
私有SQL区域分为两个区域:运行区域(Runtime Area)和持久区域(Persistent Area)。
运行区域:包含查询sql语句当前的执行状态信息。例如,如我在一个全表扫描的时候,这个运行区就跟踪在检索的数目进度。当这个执行的dml sql语句结束的时候,该区域就会被释放了。
持久区域:包含绑定变量值。在语句执行的时候提供。该区域在CURSOR关闭的时候才释放。通常,应用程序需要在关闭不再使用的CURSOR,来释放持久区域,来减少应用程序的内存需求。
客户端进程要负责管理私有区域大小。分配和返回私有区域很大程度取决于应用,当然一个客户端进程能分配的私有区域大小是被初始化参数限制的OPEN_CURSORS。
2.2.SQL Work Area
SQL工作区域是用于内存密集型操作的从PGA内存分配的。如前面内容所述:
SQL Work Areas:包含了排序区(sort Area) 、哈希区(Hash Area)、位图区(Bitmap Merge Area)
排序区:当sql语句涉及排序时,那么从数据库中查找到的内容,要在排序区排好序后,才会返回给用户。
哈希区:当进行多表联合查询时,若使用了hash连接,那么此时就需要使用哈希区进行多表合并。
位图区:用于位图合并和位图创建。
如果,操作的数据综合不能一次性放到工作区域,那么ORACLE会把输入的数据劈成更小的片。当然,多余的会先放到临时磁盘空间(临时表空间),后续处理。
当自动PGA内存管理使能的时候,数据库自动调整工作区域大小。通常,大的工作区域可能明显提升操作性能,当然代价是消耗很多的内存。
最好的是,工作区域大小足够容纳输入的数据和相关SQL操作需要的辅助内存结构。如果不够大,输入的数据将会被放到磁盘上,那么响应时间就会增大。
在极端CASE下,如果工作区域和输入的数据相比实在太小,数据库必须多次将数据分片,大大增加响应时间。
2.3 性能影响
从上面所述,我们可以得知:若sql语句没有涉及排序等,那么获取到的数据将直接从database buffer cache中一行一行的直接返回给客户。若sql语句涉及到排序,那么数据将会前往工作区的sort区进行排序。那么此时工作区的大小将直接影响数据库的处理能力。所以工作区的大小是我们性能的关注重点。
