1 sga组成: 2b4p1s(记忆)
database buffer cache:包括 default pool,keep pool,recycle pool;
redo log buffer
share pool:包括 library cache,dictionary cache
large pool
java pool
streams pool
fixed sga 这部分区域的大小只有几MB
2.pga组成:
1)stack space(sql work area) :sort area(排序区),hash area(构造hash表),bitmap merge area(索引区)
2)uga区: (private sql area占主要部分):
2.1) persistent 区域 :存放绑定变量的值,以及数据类型等游标信息
2.2) run-time 区域 :查询执行状态信息,X$KSMUP
Oracle为执行sql的每个session分配一个private sql area,这个区域还存储了一个很重要的地址信息用来指向存储在library cache中的shared sql area,
里面保存了SQl的执行计划。Oracle建议程序开发过程当中尽可能多使用bind variable目的就是为了下降hard parse,
直接意思的理解就是让咱们尽可能重用library cache中的SQL执行计划,这样就能够下降share pool latch和library cache latch等闩的竞争。
其中bind variable从那里来呢?上面其实已经提到了就是在private sql area中的永久内存区域存在,这个区域只有在游标关闭的状态下才被释放。
这里最后要了解的是,永久内存或者是运行时内存的释放并非将内存反还给OS,而是反还给了UGA java
PGA 是特定于一个操做系统进程或线程的内存区,且不和系统上的其余进程或线程共享。因为 PGA 是特定于进程的,因此它决不会在 SGA 中分配。PGA 是包含某个专用或共享服务器进程所需的会话变量的内存堆。服务器进程在须要时会在 PGA 中分配内存结构。sql
PGA 比如是文员所使用的临时工做台面。在这个比喻中,文员是为客户(客户端进程) 服务的服务器进程。文员清理出台面的一部分,使用这个工做空间来存储有关客户要求的详细信息,并对顾客请求的文件夹排序,而后在完成工做时让出工做空间。数据库
下图显示某个未配置为共享服务器的实例的 PGA(全部 PGA 的集合) 。您可使用一个初始化参数设置实例 PGA 的目标最大大小。根据须要, 各个 PGA 能够按需增大到这个目标大小。编程
图 2:实例 PGA缓存
Note:
后台进程也分配它们本身的 PGA。 本讨论的重点仅限于服务器进程 PGA。
See Also:性能优化
PGA 被进一步细分为多个不一样区域,每个都有不一样的目的。服务器
下图显示一个专用服务器会话的 PGA 中可能包含的内容。不是全部的 PGA 区域在任何状况下都存在。session
图 3:PGA 内容并发
私有 SQL 区保存了有关某个已解析的 SQL 语句的信息,和其余特定于会话的信息。ide
当服务器进程执行 SQL 或 PL/SQL 代码时,该过程使用其私有SQL 区域,来存储绑定变量值、查询执行状态信息、和查询执行工做区。
不要混淆在 UGA 中的私有 SQL 区,和在 SGA 中存储执行计划的共享 SQL区。在相同或不一样的会话中的多个私有 SQL 区,可能指向 SGA 中的一个单一执行计划。 例如,在某个会话中运行“SELECT * FROM sales” 20 次,而在另外一个不一样的会话中运行同一查询 10 次,但它们能够共享相同的执行计划。每次运行的私有 SQL 区并不共享,所以可能包含不一样的值和数据。
游标是指向某个特定的私有 SQL 区的一个名称或句柄。以下图所示,你能够将游标当作是一个从客户端指向服务器端状态信息的指针。游标与私有 SQL 区密切相关,这两个术语有时能够互换使用。
图 4:游标
私有 SQL 区又分为如下几个区域:
客户端进程负责管理私有 SQL 区。虽然客户端进程能够分配的私有 SQL 区数量由初始化参数 OPEN_CURSORS 限制,但私有 SQL 区的分配和释放主要取决于应用程序。
尽管大多数用户依赖于数据库实用程序的自动游标处理机制,但 Oracle 数据库编程接口仍为开发人员提供了对游标更多的控制。通常状况下,应用程序应关闭全部打开的且再也不使用的游标,以释放持久区域, 并最小化应用程序用户的内存需求。
See Also:
工做区是在 PGA 中为内存密集型操做分配的私有内存区。
例如, 排序操做使用排序区来对一组行进行排序。一样,哈希联接操做将其左侧数据为输入,并使用哈希区来建立一个哈希表,而位图合并操做则使用位图合并区来合并从扫描多个位图索引检索到的数据。
以下示例显示了 employees 表和 departments 表相联接的查询计划。
SQL> SELECT * 2 FROM employees e JOIN departments d 3 ON e.department_id=d.department_id 4 ORDER BY last_name; -------------------------------------------------------------------------------- | Id| Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 106 | 9328 | 7 (29)| 00:00:01 | | 1 | SORT ORDER BY | | 106 | 9328 | 7 (29)| 00:00:01 | |*2 | HASH JOIN | | 106 | 9328 | 6 (17)| 00:00:01 | | 3 | TABLE ACCESS FULL| DEPARTMENTS | 27 | 540 | 2 (0)| 00:00:01 | | 4 | TABLE ACCESS FULL| EMPLOYEES | 107 | 7276 | 3 (0)| 00:00:01 | --------------------------------------------------------------------------------
在示例 1 中,run-time 区域跟踪全表扫描的进度。此会话在哈希区中执行一个哈希联接,以匹配两个表中的行。而 ORDER BY 排序操做在排序区中进行。
若是要由该运算符处理的数据量太大,不能在SQL Work 区中完成, 则 Oracle 数据库会将输入数据分红更小的片段。这样一来,数据库先在内存中处理一些数据片段,而将其他数据写入到临时磁盘存储,以待后续处理。
当启用了自动 PGA 内存管理时,数据库自动优化工做区大小。你也能够手动控制和优化工做区大小。更多的信息,请参阅“Memory Management”。
一般,更大的工做区能够显著提升操做性能,但这是以更多的内存消耗为代价的。理想的状况是,工做区域的大小足以容纳由其关联的SQL操做符分配的输入数据和辅助内存结构。不然,响应时间会增长,由于输入数据的一部分必须被缓存到磁盘上。在极端状况下,若是工做区的大小相比输入数据的大小显得太小,则数据库必须来回屡次倒腾这些数据片段,极大地增大了响应时间。
See Also:
PGA 内存分配取决于数据库是使用专用的仍是共享的服务器链接。
表 1 显示了差别之处。
内存区 | 专用服务器 | 共享服务器 |
---|---|---|
会话内存的性质 | 私有的 | 共享的 |
persistent 区域的位置 | PGA | SGA |
DML/DDL 语句的run-time区域的位置 | PGA | SGA |
表 14-1 专用和共享服务器之间的内存分配差别
See Also:
UGA 是为会话变量分配的会话内存, 如登陆信息和数据库会话所需的其余信息。 实际上,UGA 存储了会话状态。
图 1 描述了 UGA
图 1:用户全局区 (UGA)
若是某个会话将 PL/SQL 包加载到内存, 则在 UGA 中包含包状态,便是全部包变量在某个特定的时刻所存储的值集。当包的子程序更改变量的值时,包状态也将更改。默认状况下,包变量在会话的存活期间是惟一且持久的。
OLAP 页面缓冲池也存储在 UGA 中。该池管理至关于数据块的 OLAP 数据页。页缓冲池在启动一个 OLAP 会话时分配,并在该会话结束时释放。每当用户查询一个多维对象(如立方体)时,就会自动打开一个 OLAP 会话。
该 UGA 必须在数据库会话的整个存活期间是可用的。 因为这个缘由, 当使用共享服务器的链接时,UGA 不能存储在 PGA 中,由于 PGA 是特定于单个进程的。所以,当使用共享服务器的链接时,UGA 被存储在 SGA 中,以使任何共享服务器进程都能访问它。在使用专用服务器的链接时, UGA 存储在 PGA 中。
uga:user global area ,是会话含义的内存区 为了保证数据能够被会话访问到,因此mts模式属于sga中的大池,专有模式属于pga,属于用户的内存区。
uga保存当前会话相关的信息,好比会话登陆信息、pl/sql包的参数信息,绑定变量的值。
pga:program global area,是操做系统含义上的内存区,
能够理解为操做系统在一个进程启动时,为他分配的内存空间
查询使用 show pga;
sga:共享数据块,全部进程能够访问,数据并发访问 涉及lock,latch,锁定和队列 是数据库最主要优化区域,一些重要的指标:data buffer hit,library hit(hard/soft parse),hot blockspga:为专有进程服务,进程间没法数据共享,数据独占 无需锁定机制 性能优化只须要考虑它的大小。