Oracle 内存结构
内存结构
Oracle内存,进程与数据库的图

sga:系统全局区,用来存放操作的数据,库缓存,数据字典等控制信息的内存区域,
pga:进程全局区,服务进程专用的内存区域,大多数内容非共享
uga:用来保存用户的会话信息(如打开的游标,执行语句的私有变量),如果使用专用服务器,则uga在pga中分配,使用共享服务器,则uga在sga中分配。

1 sga组成结构
sga是用来缓存数据库数据及控制信息的内存结构,大部分共享存在,sga中不同的池
共享池:share pool 控制大小—shared_pool_size
Java池 java pool—java_pool_size
大池 large pool—large_pool_size
流池 streams pool—streams_pool_size
数据缓冲区 database buffer cache—db_*_cache_size
重做日志缓冲区 redolog buffer cache—log_buffer
另外2个重要的参数,作用于整个sga内存区
sga_target:控制sga自动内存管理
sga_max_size:控制实例运行时sga最大能使用的内存空间
memory_target:用于自动内存管理(11g)

1.1 与sga相关的初始化参数
9i开始,oracle允许在实例运行中动态的修改sga的内存分配参数,而不需要重启实例
10g中直接支持修改当前内存参数值:shared_pool_size,large_pool_size,java_pool_size,
streams_pool_size,db_cache_size,sga_target
alter system set db_cache_size=2000m;
在sga中设置内存是,oracle已粒度作为单位,粒度大小不能修改,
SQL> show parameter java_pool_size;
NAME TYPE VALUE
------------------------------------ ----------- --------------
java_pool_size big integer 0
SQL> alter system set java_pool_size=5m;
System altered.
SQL> show parameter java_pool_size;
NAME TYPE VALUE
------------------------------------ ----------- --------------
java_pool_size big integer 8M
查看粒度大小
select component,granule_size from v$sga_dynamic_components
设置sga中的值时,不能超过sga_max_size的值
要修改db_cache_size的大小:1首先调低其他sga参数的大小,保证能有充分的空间来设置db_cache_size的大小 2 增加sga_max_size的值(物理条件允许),然后在调整db_cache_size,sga_max_size的值不能动态修改,重启才能生效
1.2 查看sga中的内存分配
show sga
select * from v$sga
select name,bytes from v$sgainfo—详细分配信息
2 自动管理sga
10g之前,需要手动设置几个参数值,sga中的内存只能自己使用,无法相互之间共享,
10g之后,引入sga_target参数,大于0,自动分配,等于0,则有dba手动分配
Statistics_level,设置为tepical或all,以便收集足够的统计信息,
select * from v$parameter where name='statistics_level'
alter system set sga_target=256m scope=spfile;
select * from v$parameter where name='sga_target'
3 数据缓冲区管理
在内存中操作数据,数据缓冲区用来存放从数据文件读取到的数据,数据缓冲区中的数据共享存在,数据一次性独到缓冲区,只要不被替换出,下次可以继续在缓冲区中读取,
3.1 数据在缓冲区中的管理方式
Oracle通过维护2个列表来管理数据缓冲区中的缓存块
写入列表:维护的是脏块,数据发生了修改,还未写到数据文件的数据
lru(最近最少使用)列表,包含空闲buffer,命中buffer,以及没来及写入的脏块
Oracle读取数据,首先检查数据缓冲区中是否有,没有则从数据文件中读取到buffer中,如果没有足够的buffer,则去搜索足够的空间,在搜索的过程中,如果遇到脏块,则dbwr进程将脏数据块写入到数据文件,如果搜索到足够的空间,则把数据读到缓冲区中。
刚刚读到buffer中的数据,并不是出现在mru端中,如全表触发的数据可能在lru段,具体在那个地方,有oracle决定。
如果搜索的数据缓存块达到一定的值,还没有找到空闲的内存,那oracle将启动dbwr进程,写脏数据倒文件,脏块就会变成空闲块
直接从buffer中读取(数据命中率)
查询命中率
select 1-(sum(decode(name,'physical reads',value,0))/
(sum(decode(name,'db block gets',value,0))+
(sum(decode(name,'consistent gets',value,0))))) "buffer hit ratio" from v$sysstat
一般低于95%就要注意调整sql
3.2 数据缓存区的大小设置
默认池:默认情况下从数据文件读取的数据都是存这里,对应初始化参数db_cache_size,
保持池:为了访问频繁但是不热的数据, keep pool,对应参数buffer_pool_keep
回收池:与keep相反,将不需要保存在buffer cache的数据快速替换出缓冲区,对应参数buffer_pool_recycle
数据加载到缓冲区时,存放在那个缓存池由对象的存储属性决定,在创建对象时,可以指定storage参数将会把数据加载到那个缓存池
Create table test(a number)storage(buffer_pool_keep)
不指定默认为在默认池
非标准数据块大小,db_nk_cache_size:2.4.8.16.32
SQL> show parameter db_block_size;
NAME TYPE VALUE
------------------------------------ ----------- -----
db_block_size integer 8192
alter system set db_16k_block_size=100m scope=spfile;
create tablespace 16k datafile ‘’size 100m blocksize 16k;
select name,bytes from v$sgainfo
4 共享池管理
Shared pool是sga中重要的组成部分,库缓存,数据字典缓存,用于并行执行消息缓存及控制结构组成
对应参数shared_pool_size
数据字典缓存,一般v$视图和dba_*(包含all和user)视图就存储在这里,
库缓存主要放执行过的sql和plsql,目的是为了重用
select sum(bytes)/1024/1024 mbytes from v$sgastat where pool='shared pool'
5 其他缓冲区管理
5.1 重做日志缓冲区
对对象的修改inset update create等等都会生成重做记录,重做日志缓冲区就是用来临时保存这些重做记录的区域,对应初始化参数log_buffer
重做日志缓冲区满足一定的条件就会触发后天lgwr进程将其写到重做日志
每3秒一次
无论何时有人commit
要求lgwr切换日志文件
重做日志缓冲区慢1/3时或者包含了1m的缓存重做日志数据
查看大小 select * from v$parameter where name='log_buffer'
select name,value/1024/1024 from v$parameter where name='log_buffer'
5.2 大池
Large_pool_size
执行并行查询:用来分配和协调并行任务
Rman备份:用于rman备份的磁盘的i/o缓存区
Uga:共享服务器连接,uga在这里分配
6 sga的共享池和数据缓存池的分配
1 v$db_cache_advice 参考值
用来生成不同大小数据缓存池的开销
select * from v$db_cache_advice
2 v$shared_pool_advice
select * from v$shared_pool_advice
6 pga的组成结构
pga是一,每块保存服务器进程的数据和控制信息的内存结构,oracle进程的专用区域,都非共享个连接到oracle的进程都有自己的pga区域,
专用服务器:私有sql区,会话内存区
单个会话允许的最大游标数open_cursors
Alter system set open_cursors=1000;
select * from v$parameter where name='open_cursors'
8 pga的管理
对于复杂的查询,pga中有专门的缓冲区,sql工作区
排序,hash –join,bitmap
pga_aggregate_target是一个上限目标
workarea_size_policy:manual或者auto,默认auto
将workarea_size_policy 设置为auto,Pga_aggregate_target有一个非0的值,oracle就会使用自动pga管理
select * from v$pga_target_advice
pga的参考值,v$pga_target_advice视图显示的预估值,需要statistics_level设置为all或者typical才有效。
Oracle 内存结构的更多相关文章
- Oracle数据库基础入门《二》Oracle内存结构
Oracle数据库基础入门<二>Oracle内存结构 Oracle 的内存由系统全局区(System Global Area,简称 SGA)和程序全局区(Program Global Ar ...
- oracle 内存结构具体解释
Oracle 内存结构 与 Oracle 实例关联的基本内存结构包含: 系统全局区 (SGA):由全部server和后台进程共享.SGA 中存储的数据演示样例包含快速缓存的数据块和共享 SQL 区域. ...
- Oracle内存结构:SGA PGA UGA
内存结构是oracle数据库最重要的组成部分之一,在数据库中的操作或多或少都会依赖到内存,是影响数据库性能的重要因素Oracle数据库中包括3个基本的内存结构: 一. 系统全局区 (System G ...
- oracle内存结构
一.内存结构 SGA(System Global Area):由所有服务进程和后台进程共享: PGA(Program Global Area):由每个服务进程.后台进程专有:每个进程都有一个PGA. ...
- 【转】Oracle基础结构认知——oracle内存结构 礼记八目 2017-12-15 20:31:27
oracle的数据库实例是一组后台进程和内存结构组成的,而内存结构由系统全局区(system global area)和程序全局区(program global area)组成. #修改SGA和PGA ...
- Oracle内存结构(之三)
[深入解析--eygle] 学习笔记 1.2.3 PGA的管理: sys@felix SQL>show parameter area_size NAME TYPE VALUE --------- ...
- oracle 内存结构 share pool sql解析的过程
1.sql解析的过程 oracle首先将SQL文本转化为ASCII字符,然后根据hash函数计算其对应的hash值(hash_value).根据计算出的hash值到library cache中找到对应 ...
- ORACLE内存结构之SGA
SGA的管理: SQL> show parameter sga NAME TYPE VALUE ---------- ...
- ORACLE内存结构:PGA And UGA,ORACLE用户进程、服务器进程
执行一个SQL语句 执行查询语句的过程: 用户进程执行一个查询语句如select * from emp where empno=7839 用户进程和服务器进程建立连接,把改用户进程的信息存储到PGA的 ...
随机推荐
- vs 2010 mvc 3.0安装软件
下载链接如下:MVC 3安装包:http://www.microsoft.com/downloads/zh-cn/details.aspx?familyid=d2928bc1-f48c-4e95-a0 ...
- Java日期时间输出格式优化
使用printf格式化日期 printf 方法可以很轻松地格式化时间和日期.使用两个字母格式,它以 %t 开头并且以下面表格中的一个字母结尾. 转 换 符 说 明 示 例 c 包括全部 ...
- 0.00-050613_zc
1. ROM bios --> 启动盘第一个扇区(此处内容为boot) 加载到 内存位置0x7C00(31KB) --> 执行权转移(也就相当于跳转) boot程序主要功能:把 软盘/映像 ...
- php如何查看扩展是否开启
php如何查看扩展是否开启 一.总结 一句话总结:php -m 1.查看php已安装扩展命令 ? php -m 2.phpinfo();这是最常用的方法,但那么多扩展一时还真不太好找.? 3.exte ...
- Model compatibility cannot be checked because the database does not contain model metadata. Ensure that IncludeMetadataConvention has been added to the DbModelBuilder conventions
Model compatibility cannot be checked because the database does not contain model metadata. Ensure t ...
- hdu2665 主席树(可持久化线段树)
题意:给定一个数组,每次查询第l到r区间的第k大值 解法嘛,当然是主席树,主席树即可持久化线段树,什么叫可持久化呢,就是指能够访问历史版本的数据结构,那么对于某些只能离线处理的题目强制在线之后 ,可以 ...
- 使用手势对UIImageView进行缩放、旋转和移动(转)
原文地址:http://blog.csdn.net/crazy_frog/article/details/8664108 // 添加所有的手势 - (void) addGestureRecognize ...
- hibernate - 一级缓存和三种状态解析
转载自:http://www.cnblogs.com/whgk/p/6103038.html 一.一级缓存和快照 什么是一级缓存呢? 很简单,每次hibernate跟数据库打交道时,都是通过sessi ...
- C8051F340 USB Fn hacking
/************************************************************************************ * C8051F340 US ...
- PHP学习之数组Array操作和键值对操作函数(一)
PHP 中的数组实际上是一个有序映射.映射是一种把 values关联到 keys 的类型.此类型在很多方面做了优化,因此可以把它当成真正的数组,或列表(向量),散列表(是映射的一种实现),字典,集合, ...