oracle 之 内存—鞭辟近里(二)
pga是一个内存堆,其中包含了被专用服务器或是共享服务器金曾锁需要的一些会话变量信息。服务器进程需要在pga中分配一些所需的内存结构。
一个比喻为,pga是一个临时的文件管理员的工作区域,这个文件管理员就是服务进程,她是为客户服务工作的(client process),然后文件管理员把工作区域分为很多的区域,然后来处理或是保存客户的不同信息,当这个工作完成的时候,那么相关区域的空间就会被释放掉。
如下图,显示了在专用服务器模式下所有的进程分配的pga的信息(注意background 进程也是需要分配pga的),可以使用一个初始化参数设置一个大的instance pga 值,然后每个私有的pga分别占用instance pga的一部分size:
A)pga 组件内容
pga是被划分为很多不同的区域的,每个区域都有不同的目的功能。下面是一个专用服务器模式下pga的内存分配情况,并不是所有的组件都是必须存在的。
看到很多大师把pga分成两部分,一部分为fixed area(固定区域)和variable area(可变区域),
可变区域又分为会话内存(session memory)和私有sql区(private sql area),私有sql区又分为永久区域(persistent area)和运行区域(runtime area 和sql work areas)。
我想这样分也是有意义的,先按照官网文档分发的就如上图所示了。
private sql area:
私有sql区包含一些关于sql语句解析的信息以及其他进程相关的会话信息。当一个服务进程处理sql或是pl/sql代码的时候,进程就会使用私有sql去来存储变量信息和语句查询执行状态信息以及语句执行区域信息。
private sql area 在uga中,通过使用共享sql区域来存储语句执行计划,这些在sga中分配。
1)shared sql area:
当一个sql语句第一次被执行的时候,那么数据库就会使用shared sql area 去处理折条语句,这个区域是共享的,可以被其他用户所访问,其中包含了语句的执行分析树以及执行计划。在这个区域中每个shared sql area为一个唯一的语句存在。(详细内容将在sga和shared pool中进行说明)
2)private sql area
当一个会话执行一个sql语句的时候,这个私有sql area 就会在pga中进行分配了。每个session都会有一个private sql area,如果执行同一个sql那么会指向同一个shared sql area。
eg:我执行了select * from t在一个session中执行20此和在10个不同的session执行同样这条语句,那么会共享同样的sql语句执行计划。但是private area 可能是不能够被共享的,因为其中可能存储的不同的变量值和数据。
其实我们在进行dml以及ddl操作的时候隐含的都是打开cursor,每个游标都作为客户端一边指向服务端的一条指针,每个游标打开都会分配相应的private sql area。因此在应用开发的过程中应该及时释放关闭游标,释放内存占用,以提高内存使用率。
客户端进程负载管理私有sql 区域,释放和分配private sql area依据应用,但是我们可以使用open_cursor这个参数来进行控制client process 能够打开的游标数量。
这个private sql area 被分为两个区域:runtime area 和persistent area
1)runtime area
当执行一个请求的时候第一步就分配了runtime area,它包含查询执行状态信息,如我在一个全表扫描的时候,这个运行区就跟踪在检索的数目进度。当这个执行的dml sql语句结束的时候,该区域就会被释放了。
2)persistent area:
该区域包含了变量值(bind variable),这个永久区域当游标被关闭的时候内存得以释放:
eg:select * from t where name=:value;
那么value就是这个bind variable
sql work area:
该工作区在pga中被私有分配,使用与密集型操作,如我进行sort operator的时候,那么就会使用sort area 来存储sort 的行,当我进行hash join的时候,那么我就会使用hash area来存储相应的检索内容,当使用bitmap merge的时候,那么就会使用bitmap merge area 来从位图索引进行scan来合并数据。
eg:
SQL> select * from student s join class c on s.id=c.id(+) order by s.id desc;
---------- -------------------- ---------- ---------- ---------- --------------------
8 h 20 2
7 g 26 3
6 f 25 1
5 e 23 3
4 d 23 1
3 c 22 1 3 3
2 b 21 2 2 2
1 a 20 1 1 1
SQL> r
1* select * from student s join class c on s.id=c.id(+) order by s.id desc
----------------------------------------------------------
Plan hash value: 537866712
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 8 | 608 | 5 (40)| 00:00:01 |
| 1 | SORT ORDER BY | | 8 | 608 | 5 (40)| 00:00:01 |
| 2 | MERGE JOIN OUTER | | 8 | 608 | 4 (25)| 00:00:01 |
| 3 | TABLE ACCESS BY INDEX ROWID| STUDENT | 8 | 408 | 1 (0)| 00:00:01 |
| 4 | INDEX FULL SCAN | PRIMARY_KEY | 8 | | 1 (0)| 00:00:01 |
|* 5 | SORT JOIN | | 3 | 75 | 3 (34)| 00:00:01 |
| 6 | TABLE ACCESS FULL | CLASS | 3 | 75 | 2 (0)| 00:00:01 |
---------------------------------------------------------------------------------------------
---------------------------------------------------
filter("S"."ID"="C"."ID"(+))
-----
- dynamic sampling used for this statement (level=2)
在这个执行计划中可以看出sort order by是在sort area 中的,private sql 中的运行区域在calss表汇总执行了一个全表扫描的进度,这个会话执行了一个left join 在两个表中获取了相应数据。
当work area 工作区域很小的时候,不能够容纳锁执行语句的数据信息,那么就会把执行的数据信息划分为很多的数据piece,然后oracle缓慢的进行处理piece,其他的piece 会被暂时缓存到disk中,因此我们应该保证有足够的内存给予work area一边减小disk 的i/o,以便提高系统系能。
B)pga在共享服务器和专用服务器模式下组件的不同分配情况。
Memory Area | Dedicated Server | Shared Server |
---|---|---|
Nature of session memory |
Private |
Shared |
Location of the persistent area |
PGA |
SGA |
Location of the run-time area for DML/DDL statements |
PGA |
PGA |
++++++++++++++++++++++++++++++++++++++++++++++++↖(^ω^)↗+++++++++++++
oracle 之 内存—鞭辟近里(二)的更多相关文章
- oracle 之 内存—鞭辟近里(三)
oracle 之 内存—鞭辟近里(三) 今天是2013-07-08,今天晚上突然接到一个电话,我的外甥问我的qq是多少,我感觉很吃惊,他长大了.在他现在这个年龄就开始接触网络,我难免有少许担心,希望他 ...
- oracle 之 内存—鞭辟近里(四)
oracle 之 内存—鞭辟近里(四) 今天是2013-07-11日,首先我非常感谢我的哥们也是我的网友杨工,非常感谢他能在大数据库内帮我执行一下我所需要的信息.就是他说的网络真是一个互助友爱的平台. ...
- oracle 之 内存—鞭辟近里(一)
oracle 之 内存—鞭辟近里(一) 今天是2013-07-8日,这几天一直都在寻找一本深入研究oracle内存的书籍,期间一波三折弄的自己神魂颠倒,但是还是被我拿下了,感谢支持我的朋友,这周打算把 ...
- oracle实例内存(SGA和PGA)调整
修改oracle内存占用 >show parameter sga; (查看内存占用情况) NAME TYPE ...
- oracle实例内存(SGA和PGA)调整-xin
一.名词解释 (1)SGA:System Global Area是Oracle Instance的基本组成部分,在实例启动时分配;系统全局域SGA主要由三部分构成:共享池.数据缓冲区.日志缓冲区. ( ...
- oracle 初探内存结构
数据库的存储机构 分为 逻辑存储结构 和 物理存储结构 逻辑存储结构: 数据库.表空间.段.区.块 物理存储结构: 数据库.控制文件.数据文件.初始化参数文件.OS块等. 一个区只能在 ...
- 修改oracle数据库内存报错
今天修改oracle数据库内存时, alter system set memory_max_target=10240M scope=spfile;语句正确修改:但重启时却报错 : SQL> al ...
- oracle入坑日记<二>认识oracle(含sqlplus基础使用)
1.SID(数据库实例) 1.1. oracle安装的时候有一项叫[全局数据库名]的填写项,这个就是oracle的SID也是数据库的唯一标识符: 1.2.一个oracle数据库有且只有一个SID(一般 ...
- oracle数据库内存调整之增加内存
注:本文来源:小颜Kevin <oracle数据库内存调整之增加内存> 模拟操作系统内存从2G增加为8G后,调整数据库内存参数,示例中参数不作为实际生产环境参考,因为因需所取,调整参数 ...
随机推荐
- perl 为什么要用引用来做对象呢?
perl 为什么要用引用来做对象呢? 因为一个重要的原因是 my 引用 脱离作用域,外部仍旧生效
- Qt入门-字符串类QString
原地址:http://blog.csdn.net/xgbing/article/details/7770854 QString是Unicode字符的集合,它是Qt API中使用的字符串类. QStri ...
- form里两个submit按钮,在onsubmit中判断哪个被点
记下别人的解决方法(有效): 方法1:(已验证过) <form name="form1" onsubmit="show()"> ..... < ...
- JAVA 实现发牌的 改进
java是一门面向对象的语言,我们在解决这个问题的时候先找对象.我认为面想对象 “就是把复杂的问题变简单,简单的问题程序化” .如果我们 创建一盒牌--->洗牌--->选地主牌---&g ...
- oracle如何设置show parameter显示隐含参数
在sqlplus中shwo parameter是显示不了隐藏参数的,需要做一个处理,如下所示: 以SYS用户登录: C:\Documents and Settings\guogang>sq ...
- Convert QWERTY to Dvorak
Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%lld & %llu Submit Status Pract ...
- spring boot application properties配置详解
# =================================================================== # COMMON SPRING BOOT PROPERTIE ...
- activemq java版本要求
<pre name="code" class="html">activemq: redis01:/root# cp apache-activemq- ...
- css selector: xpath:
css selector: $$(".mainLeft>div>h1") xpath: $x(".mainLeft>div>h1") n ...
- Java总结之容器
[容器的概念] 容器:Java API所提供的一系列的实例,用于在程序中存放对象. [容器 API] J2SDK所提供的容器API位于java.util包内. {Collection[Set(Hash ...