ORACLE内存结构简介

来源:互联网 发布:java中实现杨辉三角 编辑:程序博客网 时间:2024/05/16 01:21

ORACLE数据库实例启动时,需要分配共享内存,启动后台进程。ORACLE数据库所使用的内存涉及两个方面:PGA  SGA。--SGA内存分配一说是:sga=内存*0。8*0.7  
--PAG内存分配一说是:pga=内存*0。8*0.3
常规内存分配方法是将OS内存一半分给ORACLE,可根据实际情况调整。

1.    SGA

 SGA system global area 

系统全局区 是一块用于加载数据、对象并保存运行状态和数据库控制信息的一块内存区域,在数据库实例启动时分配,当实例关闭时释放,每个实例都有自己的SGA区。当数据库启动到NOMOUNT状态,SGA已经分配,同时启动后台进程,连接到ORACLE数据库的用户都可以共享SGA中数据。

Fixed Size

部分是SGA中固定部分,包含几千个变量和一些小的数据结构,如Latch或地址指针等。SCN记录在Fixed Size内存中

Data Buffer Cache

SGA的一半到三分之二可分配给BUFFER CACHE.用于存储最近使用的数据块(修改或未修改过)。Data Buffer Cache多缓冲池技术指根据数据的不同访问方式,将Data Buffer Cache分为Default,Keep,Recycle.  Default 池则存放未指定存储池 的数据,按照LRU算法管理。Keep 池中 数据倾向于一直保存,可存放经常使用的数据,Recycle池中数据倾向于即时老化,可以存放一次性读取使用的数据。默认所有表使用Default池,大小是数据缓冲区大小。

Shared Pool 共享池     

共享池最大不超过5-6G即可。

数据字典缓存主要用来保存服务器最近从磁盘数据字典内访问过的数据,主要包括表结构、用户、实体等信息,如果再有用户请求时,则服务器进程会首先从数据字典高速缓存内检索,在缓冲区内是否存在该请求用户的相关权限信息,如果没有的话,需要访问磁盘数据字典;

库缓存用于并行执行消息缓存里面保存着可执行的SQL及Pl/SQL包,以及SQL的执行计划和一些控制结构,比如锁。当一条SQL语句被执行时,Oracle尝试到LibraryCache中查找是否有相同的SQL(通过hash_value),如果有,将直接重用存在的SQL的信息(执行计划),这个称作软解析(softpase)或者叫做library cache hit,反之,SQL将被重新解析,这个过程称为硬解析hard parse或者叫library cache miss. 主要用来保存分析过的sql代码,所谓的“分析”是指,校验用户请求sql代码的语法,并且判断sql代码涉及的表和字段在数据库内是否存在;

Server Result Cache  11G新特性-结果集缓存:这部分内存中保留了SQL查询的结果集,这样对于后续的相同查询,Oracle无需重新加载数据块进行计算,直接使用现有的数据集。由参数RESULT_CACHE_MODE设定 默认值 Manual,需要使用 RESULT_CACHE hint来启用。FORCE 对所有SELECT操作生效(会消耗更多shared_pool空间)PL/SQL 函数结果对于pl/sql函数,对结果进行缓存。
关于共享池大小设置:
设置SHARED POOL原则是够用就好。在内存自动管理模式下,SHARED POOL会占用比较大;过大的SHARED POOL反而会引起MUTEX或LATCH争用。
看共享池小了还是小了,我是看select KGHLUTRN ,KGHLURCR from X$KGHLU;   1:3
如果瞬时LRU链Chunk数量超过周期LRU的 3倍,说明大量只用一次的Chunk堆积在LRU中,代表共享池太大了。

Redo log buffer 

日志缓冲区存储重做日志条目   redo entries,日志记录数据库变更,最终被写出到重做日志文件中,可用于数据恢复。

Large Pool    大池在RMAN备份时用到

是SGA一个可选组件,主要为执行一些非常复杂并且耗时很长的sql代码提供空间,例如在使用RMAN执行备份操作时,需要存放备份缓冲区,通常用于共享服务器模式MTS、并行计算或RMAN备份恢复等操作。

Java POOL

主要用于JVM等JAVA选件,实例化的Java对象提供的堆空间,如果数据库中存在大量的java代码,就可以使用该设置,不用占用常规的sga;。

Streams Pool 

为ORACLE的 Streams功能所使用,如果不定义该参数,这部分内存从Shared Pool中分配。主要用来实现与不同类型数据库,或者在不同应用环境下的数据共享;

Displays summary information about the system global area (SGA).显示有关系统全局区(SGA的摘要信息
View  SGA相关视图DescriptionV$SGAV$SGAINFODisplays size information about the SGA, including the sizes of different SGA components, the granule size, and free memory.显示关于SGA大小的信息,包括不同SGA组件颗粒大小和可用内存的大小V$SGASTATDisplays detailed information about the SGA.显示详细的关于SGA中的信息V$SGA_DYNAMIC_COMPONENTSDisplays information about the dynamic SGA components. This view summarizes information based on all completed SGA resize operations since instance startup.显示有关动态SGA组件的信息。该视图总结信息的实例启动后SGA的调整操作V$SGA_DYNAMIC_FREE_MEMORYDisplays information about the amount of SGA memory available for future dynamic SGA resize operations.显示可供动态SGA调整操作的SGA内存V$SGA_RESIZE_OPSDisplays information about the last 400 completed SGA resize operations.显示最后SGA最近400次调整大小的操作V$SGA_CURRENT_RESIZE_OPSDisplays information about SGA resize operations that are currently in progress. A resize operation is an enlargement or reduction of a dynamic SGA component.显示SGA中正在进行调整大小的操作的信息,改变大小的操作是一个动态SGA组件的放大或缩小V$SGA_TARGET_ADVICEDisplays information that helps you tuneSGA_TARGET. For more information, seeOracle Database Performance Tuning Guide.
显示的信息,帮助您调整SGA_TARGET欲了解更多信息请参阅Oracle数据库性能调优指南


2.    PGA

PGA  program global area  

是服务器进程serverprocess使用的一块包含数据和控制信息的内存区域,PGA是非共享内存,在服务器进程启动或他对时分配(系统运行时排序连接等操作可能需要进一步PGA分配),PGA中数据结构不需要通过LATCH保护。

PGA创建的两种模式

专用服务器模式dedicated server及共享服务器模式shared server。专用服务器模式,ORACLE会为每个会话启动一个ORACLE进程,而在共享服务器模式下,通常在服务器端启动一定数量的服务器进程,然后由多个客户端请求共享同一个ORACLE服务进程。

PGA内容依不同模式而有所不同。在内存分配与使用上PGA可以被区分为两个区域:

固定PGA     fixed  pga:和固定SGA类似,是PGA的保留内存。

可变PGA,variable pga:通过具体的内存分配heap分配来实现,其空间分配与使用是可以变化的。PGA可变区中主要包含会话内存session memory及私有SQL区 private sql area等。

会话内存用于存放会话的登录信息及其它相关信息。共享服务器,这部分内存是共享非私有

私有SQL区

包含绑定变量信息,查询执行状态信息以及查询工作区等。每个发出的SQL查询会话都拥有一块私有SQL区。对于专用服务器模式,这部分内存在PGA中分配。共享服务器模式,这部分内存在SGA中分配。

游标 cursor

ORACLE应用程序或用户的应用程序执行时,都可能显示或隐式打开游标opencursor来进行任务处理。打开游标需要分配SQL AREA,管理私有SQL区是用户进程的责任,而分配和回收则依赖于具体的应用程序。为防止过度SQL工作区分配,ORACLE通过open_cursors参数来限制每个用户进程能够同时打开的游标数量,一个私有SQL区在游标cursor打开时分配,当执行结束游标关闭时释放。

用户进程的任务执行以及cursor的使用是PGA内存的主要消耗者,也是进行数据库性能优化时最关心的内容,实际上数据库的活动主要就是cursor的活动。

私有SQL区组成

永久区域persiostent  area 这个区域包含绑定变量等信息,这部分内存只有在游标被关闭时才会被释放。运行时区域runtime area,这个区域存放了SQL语句运行时所需要的信息,在执行请求时首先创建,其中包含了查询执行的状态信息(如对于全表扫描,则记录全表扫描的进度等)、SQL WORK AREAS 这部分区域在内存密集型请求下分配,对于DML语句SQL语句执行完毕就释放此区域,对于查询语句则是在记录返回后或查询取消时释放。

UGA user global area用户全局区

由用户会话数据、游标状态和索引区组成。是一个session的使用到的部分内存空间..

共享服务器模式下:一个共享服务器进程被多个用户进程共享,此时UGA是sharedpool / large pool的一部分;

专用 服务器模式下UGA是PGA一部分。在专用服务器模式下PGA与UGA关系如同PROCESS和SESSION关系,PGA是服务于进程 的内存结构,包含进程信息。

UGA是服务于会话的,包含会话信息,如打开游标的永久区和运行区,包的状态信息以及变量信息,JAVA会话的状态信息,启用角色信息,跟踪事件,起作用的NLS参数等。

与CGA



内存结构图及PAG结构图

 

3. 

原创粉丝点击