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后,调整数据库内存参数,示例中参数不作为实际生产环境参考,因为因需所取,调整参数 ...
随机推荐
- 基于visual Studio2013解决面试题之1305字符串所有子集
题目
- 基于visual Studio2013解决C语言竞赛题之1044数组处理
题目 解决代码及点评 /* 分别输入N和M个数到数组A和数组B中.把只在其中一个数组中出现的那些数送入到数组C中,并指出它们在A或B数组中的位置. */ #include <s ...
- C++汉字转拼音(转)
#include<iostream> #include<string> using namespace std; string findLetter(int nCode); s ...
- EasyUI - DataGrid 组建 - [ 新增功能 ]
效果: html代码: <div> <!--使用JS加载方式--> <table id="tab"></table> <!-- ...
- EasyUI - DateBox组件
效果: html代码: <input type ="text" id ="box" /> JS代码: $(function () { //设置返回格 ...
- vim: 远程登陆服务器时可能出现的: 方向键,回退符不能正常使用
Solution of:远程登陆服务器时可能出现的: 方向键,回退符不能正常使用 远程登陆服务器,可能出现:方向键,回退符不能正常使用. 解决方法:在家目录下的.cshrc中添加set nocompa ...
- 使用JDBC获取能自动增加的主键
本篇讲述如何使用JDBC获取能自动增加的主键的值.有时候我们在向数据库插入数据时希望能返回主键的值,而不是通过查询的方式.一般来说,在多表相互关联主键约束,也就是说别的表的外键约束是该表的主键,那么在 ...
- underscore.js 源码
underscore.js 源码 underscore]JavaScript 中如何判断两个元素是否 "相同" Why underscore 最近开始看 underscore.js ...
- Minor GC、Major GC和Full GC之间的区别(转)
在 Plumbr 从事 GC 暂停检测相关功能的工作时,我被迫用自己的方式,通过大量文章.书籍和演讲来介绍我所做的工作.在整个过程中,经常对 Minor.Major.和 Full GC 事件的使用感到 ...
- 使用jdk的socket通信
使用JDK提供的API进行网络通信,会用到Socket,ServerSocket两个类.写个简单的SERVER和CLIENT之间发消息的小程序,竟然发现了挺多的问题. 这是服务器端代码: packag ...