内存管理
内存架构
数据库启动时会首先分配sga(数据库实例一部分),pag可以成为私有变量区,是某个用户独有。专有连接模式下,每个用户会话都会分配一个pga,用户保存会话信息。Sga与pga之间是服务器进程,最终是服务器进程访问sga来满足用户的数据访问的
数据库实例启动时,oracle数据库会分配内存区并启动后台进程,内存区存储了如下的信息
1. 程序代码
2. 建立过连接的会话信息(即使该会话当前不是活跃的inactive)
3. 程序执行期间所需信息,如sql查询的当前状态
4. 在进程间共享并且进行通信的信息如锁数据
5. 缓存数据,如数据库快,重做快。缓存这些在磁盘上的数据
Oracle数据库基本的内存结构包括
系统全局区(SGA):一组共享的内存结构,包括数据库实例所需的数据和控制信息,所有的服务器进程和后台进程共享
程序全局区(PGA):是非共享的内存区域,包含oracle进程所独自使用的数据和控制信息,pga与服务器进程和后台进程共存。Pga是为服务器进程和后台进程服务的内存区,为这些进程独有。为整个实例拥有
UGA用户全局区:和用户会话相关联
软件代码区:用于存储正在运行的程序代码
PGA概述
存储专有或共享服务器进程所需的会话相关变量。服务器进程负责在pga中分配它所需要的内存结构
PGA组件(可手动调整各个组件的内存分配):
私有sql区:包含解析后的sql语句和处理所需要的会话信息,当服务器进程运行sql/plsql代码时,该进程使用私有sql区存储绑定变量的值,查询执行状态信息以及查询执行工作区。在同一个或不同会话中的多个私有sql区可以执行sga中的一个执行计划,此时对于每一个执行计划的私有sql去不共享,各自包括不同的值或者数据
私有区域包含2部分
运行时区:该区域包含sql查询执行状态信息,如运行时区跟踪全表扫描中到目前为止返回的数据行数,在执行请求的第一步oracle数据库就创建运行时区,对于dml语句运行时区在sql语句关闭后自动释放内存
永久数据区:这部分存储绑定变量,绑定变量的值在sql语句运行时赋予该语句,永久数据库只有游标关闭后才释放,如果增加了session_cache_cursors的值,此时在私有SQL区就存储了较多的执行计划,此时与该执行计划相关的绑定变量占用空间不会释放,造成占用过的pga资源。所以在pga优化时要主语是否增加pga大小
客户端进程负责管理私有SQL区,私有sql区的分配和回收主要依赖于应用。客户端进程能够分配的私有sql区的数量收到初始化参数open_cursors的限制。
SQL工作区:是一个私有内存区域,在pga中分配,用于内存密集型的操作,如排序操作符使用排序区来排序行集合。hash-join操作符使用哈希区从他的左输入构建哈希表,然而bitmap merge使用bitmap merge区来合并从多位图索引扫描获得的数据。
如果操作符处理的数据总量过大,不能放入工作区,此时oracle数据库将输入分割成更小的碎片,用这种方式,数据库在内存中处理数据片,同时将其余无法处理的数据放入临时表空间待以后处理。
SGA概述
是可读写的内存区,SGA和后台进程组成了oracle数据库实例,代替用户工作的服务器进程可以读sga中的数据,服务器和后台进程不驻留sga中,而是存在于独立的内存空间中
每一个数据库都有自己的sga,数据库实例启动时候自动分配sga,关闭时自动关闭sga
SGA由几个内存组件组成,称为内存池,这些内存池的空间分配以granules为单位
即粒度为单位。粒度是一个连续的内存空间。粒度的大小与操作平台有关,由整个sga的大小决定。
Database buffer cache:数据库高速缓存
Redo log buffer:重做日志缓存
Shared pool:共享池
Large pool:大池
Java pool:java池
Streams pool:流池
Fixed sga:固有区域
数据库高速缓存是一个共享的内存结构,这意味着发生内存争用的事件都发生在共享的内存结构中。数据库高速缓存用来存储从数据文件读取的数据块,临时存储当前或最近读取的数据块,提高oracle数据库读写数据的效率,
UGA概述
会话内存,为某个用户会话服务,给会话分配内存存储会话变量,这些变量包括登录信息以及会话所需的其他信息
如果会话加载了plsql包,此时该包的状态就存在UGA中,这个状态是指在指定时刻包变量的值得集合,默认包变量在会话周期内是唯一并且持久存在的。
Olap页池:该池管理OLAP数据页,他与数据块等同。随着OLAP会话的启动和结束而分配和释放内存。
共享服务器模式下,UGA在SGA中分配,这样任何共享服务器进程都可以访问它。
专有服务器模式下,UGA在PGA中分配,因为PGA只为单个进程服务。不需要共享
内存管理
Alter system set memory_target=1000M scope=both;–设置后Sga和PGA自动调整,根据负载状态协调内存的使用。因为是动态参数,所以无需重启数据库
Memory_max_target设置memory_targer的上限
使用DBCA建库的话,默认启动自动内存管理
配置内存组件
如果没有启动自动内存管理(如使用DBCA建库时设置了SGA和PGA相关参数的值,或者使用了CREATE DATABASE 手工建库时没有设置MEMORY_TARGET参数),此时就需要启动自动内存管理特性
设置MEMORY_TARGET值,这个值通过SGA_TARGET+PGA_AGGREGATE_TARGET计算
Memory_target=sga_target+max(pga_aggregate_target,maximum PGA allocated)
Sga_target和pga_aggregate_target可通过show parameter target获得
Maximum pga allocated通过select value from v
pgastatwherename=′maximumPGAallocated′;获得考虑到SGA和PGA的将来预期,所以MEMORYMAXTARGET和MEMORYTARGET值相同,他是一个静态参数。需要如下修改ALTERSYSTEMSETMEMORYMAXTARGET=NmScope=SPFILE;如果使用PFILE启动数据库,也可以在初始化参数文件中写入如下参数值Memorymaxtarget=nMMemorytarget=MmSELECT∗FROMV
MEMORY_TARGET_ADVICE ORDER BY MEMORY_SIZE; –查看对于MEMORY_SIZE的大小设置建议,
MEMORY_SIZE_FACTOR=1(内存尺寸因子)的MEMORY_SIZE为当前的内存大小,也就是参数memory_target的大小
ESTD_DB_TIME:完成当前负载预计的DB时间
SHOW PARAMETER MEMORY TARGET;–查看memory_target的大小,可以发现与动态视图V$MEMORY_TARGET内存因子为1的memory_size大小相等
因为设置了参数memory_target所以sga_target和pga_ aggregate _target根据负载和事务情况自动调节,对应的这2个参数的值为0
如果手动设置sga_target和pga_aggregate_TARGET的大小,则oracle认为这个大小值为对应参数的最小值
Show parameter sga/pga;–查看pga和sga的大小,因为开启了自动管理所以都为0
SGA和PGA的自动调整
推荐使用自动内存管理
Show parameter area_size;–查询pag相关组件的大小
Workarea_size_policy:决定PGA自动调整还是手工调整。如果手动调整必须要设置为Manual
DBCA建库
配置数据库smart flash缓存
Smart flash cache:11g版本提供,默认此内存组件没有启动
作用:缓存更多的数据,提高读数据的效率,减少cpu的负担以及减少数据库高速缓存的压力
要求
1. 必须是solaris/oracle Enterprise Linux系统
2. 通过AWR/statspck报告提示加倍数据库高速缓存的大小
3. CPU资源短缺
启动smart flash cache后,从数据高速缓存移动到flash cache中的数据块而言,将有部分数据块的元数据存储在数据库高速缓存中.
手工调整内存,需要增加数据库高速缓存的大小,其中值为进入smart flash cache的数据块数量*100。如果采用自动内存调整则需要调整MEMORY_TARGET,大小参考手工调整内存的大小。
自动共享内存调整(sga组件自动调整):需要增加sga_target的值
设置smart flash cache 需要设置2参数,db_flash_cache_file/db_flash_cache_size
指定存储smart flash cache数据块的磁盘目录以及名称,要求必须在flash盘上存储,否则影响性能。
Show parameter flash_cache;–查询smartFlashCache涉及到的2个参数
设置2个参数值,静态参数需要重启
Alter system set db_flash_cache_file=’文件目录’ scope=spfile;
Alter system set db_flash_cache_size=1g scope=spfile;
重启
Shutdown immediate;
Startup;