引言
Oracle Server由两个实体组成:实例(instance)与数据库(database)。
实例(instance)包括:内存结构(SGA、PGA)和用户进程,实例为用户同数据库交互的媒介。
数据库(database)包括:物理结构(数据文件、日志文件、控制文件等)和逻辑结构(表空间、段、区、块、等)
Oracle内存结构与oracle性能息息相关,内存结构是CPU与IO桥梁,内存结构对于数据库来说非常重要。
一、内存结构概述
内存结构主要有:系统全局区(System Global Area简称SGA)和(Process Global Area简称PGA)组成。
系统全局区SGA:当启动实例的时候分配,是一组包含一个Oracle实例的数据和控制信息的共享内存结构。
进程全局区PGA:当Server进程建立时分配,此区域包含单个服务器进程或单个后台进程的数据和控制信息,与几个进程共享的SGA 正相反。PGA 是只被一个进程使用的私有区域。PGA 在创建进程时分配,在终止进程时回收。
二、系统全局区SGA
1.SGA由几个内存结构组成
数据高速缓冲区(Database Buffer Cache)
共享池(Shared Pool)
重做日志缓冲区(Redo Log Cache)
其他结构(如锁管理)
附图:
2.SGA可选内存结构
大池
JAVA池
注:Fixed Sized:Oracle的不同平台和不同版本可能不一样,对于确定环境是一个固定值,里面存储SGA各部分组件信息,引导建立SGA的区域。
Variable Size:包括share_pool_size、java_pool_size、large_pool_size等内存设置和管理数据缓冲区等内存结构的 Hash table、块头信息等。
Datebase Buffers:数据缓冲区,个版本包含的内容不同。
Redo Buffers:重做日志缓冲区的实际大小,和Log_buffer的值稍有不同。
SGA的管理:
△9i:SGA总大小由初始化参数SGA_MAX_SIZE确定。各个内存组件大小之和不能超过这个参数,在这个大小之下,SGA各个内存组件可以在不重启数据库的情况下直接修改大小,所以叫做SGA的动态管理。
△10g:SGA大小既可以像9i一样动态管理,也可以实施SGA的自动管理。只需要设置初始化参数SGA_TARGET,SGA各个内存组件就可以由数据库自动设置大小,设置的依据来源于自动收集的统计信息。
△11g:oracle的内存管理方式可以根据版本向下兼容,oracle 11g中引入了自动内存管理(Automatic Memory Management),仅用两个参数完成oracle的内存管理工作,参数说明:MEMORY_TARGET:oracle所能使用的最大内存,该参数可以动态调整;MEMORY_MAX_TARGET:MEMORY_TARGET参数所能动态设定的最大值,不能动态调整,需要重启数据库。
①数据高速缓冲区(Database Buffer Cache):数据高速缓冲区存储了从数据文件中检索到的数据块的镜像拷贝。
△获取和修改数据提高了性能
△通过LRU算法管理
△db_block_size决定了主块大小
△定义缓冲区数取决于db_block_size
②共享池(Shared Pool):存储最近执行过的sql语句和最近使用过的数据定义。在分析阶段,服务器进程使用 SGA 中称作共享池的区域来编译 SQL 语句。
△包括两个与性能有关的内存结构
库缓存:存储最近使用的SQL 语句信息。如果重新执行 SQL 语句而且共享 SQL 区域已经包含语句的执行计划,那么服务器进程就不需要分析语句。库高速缓存通过减少分析时间和内存要求来改善重新使用 SQL 语句的应用程序的性能。
数据字典缓存:数据库中最近使用的定义的集合。它包括有关数据库文件、表、索引、列、用户、权限以及其它数据库对象的信息。
△调整共享池大小(shared_pool_size)
alter system set shared_pool_size = “X”;
③重做日志缓冲区(Redo Log Cache):缓存对于数据块的所有修改,主要用于恢复其中的每一项修改记录。
△修改记录叫做重做条目
△重做条目包含重构和重做修改信息
△log_buffer定义大小
注:执行DDL或DML语句时,服务器进程首先将事务变化记载到重做日志缓冲区,然后才会修改数据高速缓存。
④大池:一个可选的SGA区域,可以缓解共享池(Shared Pool)负担。PARALLEL_AUTOMATIC_TUNING = TURE,大池的空间是动态的,由系统控制。
△主要作用:共享服务器的会话区域(UGA),服务器进程I/O,使用RMAN备份恢复,并行查询缓存信息。
△不使用LRU链表管理
△指定大小,alter system set large_pool_size = “X”;
△动态指定大小
查看大池已使用或未使用内存
注:如果发现未使用内存很大或者不断增加,表示大池可能分配了太多的内存,如果未使用内存很小或者不断减少,表示可能需要加大大池的内存。
⑤java池:可选的SGA区域,属于SGA中的可变区域,Java池的内存用于存储所有会话中特定Java程序代码和JVM中的数据
△java命令需要分析的环境
△安装使用java需要
△由参数JAVA_POOL_SIZE设置。Java池最大可到1 GB,不能动态调整。
查看java已使用或未使用内存
注:如果发现未使用内存很大或者不断增加,表示JAVA池可能分配了太多的内存,如果未使用内存很小或者不断减少,表示可能需要加大JAVA池的内存。
三、进程全局区(PGA)
进程全局区(PGA):此区域包含单个服务器进程或单个后台进程的数据和控制信息,与几个进程共享的SGA 正相反。PGA 是只被一个进程使用的私有区域。PGA 在创建进程时分配,在终止进程时回收。
进程全局区(PGA)包括以下组件:
△排序区:用于处理 SQL 语句时可能需要的任何排序
△会话信息:包括用于会话的用户权限和性能统计
△游标状态:标明处理会话当前使用的 SQL 语句中的阶段
△游标状态:标明处理会话当前使用的 SQL 语句中的阶段
PGA 在创建进程时分配,在终止进程时回收。
扩展阅读(网络参考资料,以下资料归属网络作者,请注重“版权”)