首页 > 数据库 > Oracle > oracle体系结构梳理---SGA+PGA
三大组件:buffer cache,shared pool,redo_log buffer
---------------------------------------------------------------
SGA 在oracle 10g之后即实现了自动化管理,在11G,可以使用memory_target参数把PGA和SGA作为一个整体进行自动管理。
1.shared pool (data dictionary cache,library cache )共享池
2.database buffer cache数据库高速缓冲区
3.redo log buffers 重做日志缓冲区
4.large pool 大池
5.java pooljava池
高速缓冲区分成以下几种子池:
1. 默认池,它在ORACLE中的大小由DB_CACHE_SIZE决定,经常使用的对象
2. KEEP 池,DB_KEEP_CACHE_SIZE 用在一些小表,不容易被挤出
alter table t storage (buffer_pool keep);
alter index IND_AA storage (buffer_pool keep);
3.回收池,DB_RECYCLE_CACHE_SIZE
alter table t storage(buffer_pool recycle);----将t表放在keep池
select segment_name,blocks,bytes/1024/1024||'M'AS "SIZE" from dba_segments where BUFFER_POOL = 'RECYCLE';
----回收池避免大表将buffer cache 中常用的小表踢出,二是将其存储在一个回收区,用完之后迅速释放
理论上讲,默认池中的对象应该足够热(也就是说,用得足够多),可以保证一直呆在缓存中。缓存会把它们一直留在内存中。可能还有一些段相当热门,但是并不太热;这些块就作为温块。这些段的块可以从缓存刷新输出,为不常用的一些块(“不适合缓存”块)腾出空间。为了保持这些温段的块得到缓存,可以采取下面的某种做法:将这些段分配到保持池,力图让温块在缓冲区缓存中停留得更久。将“不适合缓存”段分配到回收池,让回收池相当小,以便块能快速地进入缓存和离开缓存(减少管理的开销)。这样会增加DBA 所要执行的管理工作,因为要考虑3 个缓存,要确定它们的大小,还要为这些缓存分配对象。还要记住,这些池之间没有共享,所以,如果保持池有大量未用的空间,即使默认池或回收池空间不够用了,保持池也不会把未用空间交出来。总之,这些池一般被视为一种非常精细的低级调优设备,只有所有其他调优手段大多用过之后才应考虑使用。11g之后sga内存管理均可以设置auto方式。
REDO BUFFER大小由LOG_BUFFER决定
Large pool和Java pool
SGA 中三大组件:
第一个组件:共享池,用来存放SQL解析树和字典对象定义的共享区域。
第二个组件,数据库高速缓存区,用来存放业务数据的共享内存区域。
第三个组件,REDO日志缓存区
第四个组件,其它共享资源,如LOCK,ENQUEUE,LATCH,统计数据。
接下来将通过一条SQL 语句的执行过程来认识这三个组件在oracle中的具体作用:
---SELECT * FROM EMP;
解析:首先接收到这一条命令的时候,现在 data dictionary cache(数据字典缓存)中校验表的相关定义相关行以及命令发出用户的权限,
然后在 shared pool 中的 library cache 中查看语句之前是否已经解析,如果有,则直接按照之前的解析执行,
如果没有则发生硬解析,然后根据执行计划,去取 database buffer cache 中取数据。
row cache
数据字典缓存也被称为行缓存(Row Cache),因为它是以记录行为单元存储数据的 作来语意分析,
比如:检查对象是否存在,列是否存在,是否有权限等。
row cache保存了最近最常使用的数据对象定义,如用户、权限、列、表、索引等全部可以放到数据字典共享。
---物理读 和 逻辑读
物理读即在磁盘中读取数据
逻辑读是指在内存中读取
逻辑读 = 当前读 + 一致读
-----实验
sql>1 create table t(id,int);
sql>1 insert t values(1);
sql>1 commit;
sql>1 update t set id=2 where id=1;
sql>1 select * from t;-----2 当前读 db block gets
sql>2 select * from t;-----1 一致读 consistent gets
sql>2 update t set id=3 where id=3;---发生两次一致读,一次当前读
--------------------------------------------------------------------
PGA
---一条sql语句的执行过程
1.语法检查selet form
2.语意检查 相关的对象是否存在,比如:表,列等
3.名称转换 同义词或视图等 scott.emp
4.权限
5.将sql取hash值,hash value hash(select ename,sal from emp)返回一串字符执行计划的hash value
6. 如果没有相同的hash值,则硬解析.
7.通过优化器创建一个最优的执行计划(需要分析计算成本)。
8. 如果是第一次执行,则将该游标所产生的执行计划、SQL文本等装载进library cache的若干个heap中,以便下一次来匹配。
9. 如果是第三次执行相同的sql,则将执行计划等信息cache到PGA中
10. 通过私有CURSOR,执行SQL
11. 如果是SELECT,则需要PGA来FETCH数据
PGA
中包含了关于进程使用到的操作系统资源的信息,以及一些关于进程状态的信息。而关于进程使用的Oracle共享资源的信息则是在SGA中。
SGA中存放的内容: 主要概括来说就是会话在执行的过程中一些SQL语句的返回结果以及排序结果等的暂时存放地。
WORKAREA_SIZE_POLICY= MANUAL---PGA 的管理方式 auto自动和 manual 手动
pga_aggregate_target>0,WORKAREA_SIZE_POLICY= AUTO,表示PGA自动管理
1. 会话内存(session memory)
2. 私有 SQL 区(private SQL area)
每一个发出sql语句的session都有自己的私有sql区域
1) 固定部分(persistent area),包含绑定信息(bind information)之类的数据
2) 运行部分(run-time area),当游标执行结束就会被释放。---将查询的结果存储在PGA中,等所有结果出来时,再释放游标
INSERT
UPDATE
DELETE
3. 游标及共享 SQL 区
句柄==指针
一个共享sql去可以对应多个私有sql区---银行和客户的关系
共享sql区有句柄,有执行计划,私有sql区只保存了一个指针类型的东西
私有CURSOR只有句柄,没有执行计划
而共享CURSOR,有句柄,还有执行计划
4. SQL 工作区
1) SORT_AREA_SIZE: 需要进行排序的操作
2) SORT_AREA_RETAINED_SIZE:排序完成后用于保存已排序数据的内存总量 SORT_AREA_RETAINED_SIZE=0 说明SORT_AREA_RETAINED_SIZE=SORT_AREA_SIZE
不用返回给用户则不用使用SORT_AREA_SIZE如:INSERT INTO T SELECT * FROM emp ORDER BY ename;
3) HASH_AREA_SIZE:哈希连接(hash-join)
4) bitmap_merge_area_size: 位图合并(bitmap merge)
5) create_bitmap_area_size
位图创建(bitmap create)
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/30018455/viewspace-1409115/ ,如需转载,请注明出处,否则将追究法律责任。