引言

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)

其他结构(如锁管理)

附图:

把Oracle内存结构说透_内存

2.SGA可选内存结构

大池

JAVA池

注:Fixed Sized:Oracle的不同平台和不同版本可能不一样,对于确定环境是一个固定值,里面存储SGA各部分组件信息,引导建立SGA的区域。

Variable Size:包括share_pool_size、java_pool_size、large_pool_size等内存设置和管理数据缓冲区等内存结构的 Hash table、块头信息等。把Oracle内存结构说透_database_02

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参数所能动态设定的最大值,不能动态调整,需要重启数据库。

把Oracle内存结构说透_Oracle_03

①数据高速缓冲区(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”;

   △动态指定大小

查看大池已使用或未使用内存

把Oracle内存结构说透_database_04

注:如果发现未使用内存很大或者不断增加,表示大池可能分配了太多的内存,如果未使用内存很小或者不断减少,表示可能需要加大大池的内存。

⑤java池:可选的SGA区域,属于SGA中的可变区域,Java池的内存用于存储所有会话中特定Java程序代码和JVM中的数据

   △java命令需要分析的环境

   △安装使用java需要

   △由参数JAVA_POOL_SIZE设置。Java池最大可到1 GB,不能动态调整。

查看java已使用或未使用内存

把Oracle内存结构说透_用户_05

注:如果发现未使用内存很大或者不断增加,表示JAVA池可能分配了太多的内存,如果未使用内存很小或者不断减少,表示可能需要加大JAVA池的内存。

三、进程全局区(PGA)

进程全局区(PGA):此区域包含单个服务器进程或单个后台进程的数据和控制信息,与几个进程共享的SGA 正相反。PGA 是只被一个进程使用的私有区域。PGA 在创建进程时分配,在终止进程时回收。

进程全局区(PGA)包括以下组件:

   △排序区:用于处理 SQL 语句时可能需要的任何排序

   △会话信息:包括用于会话的用户权限和性能统计

   △游标状态:标明处理会话当前使用的 SQL 语句中的阶段

   △游标状态:标明处理会话当前使用的 SQL 语句中的阶段

PGA 在创建进程时分配,在终止进程时回收。

扩展阅读(网络参考资料,以下资料归属网络作者,请注重“版权”)

http://v.youku.com/v_show/id_XMzQ5OTE0OTQ0.html                             sga视频
http://blog.csdn.net/yujin2010good/article/details/7709120                  oracle体系结构
http://database.51cto.com/art/201010/231747.htm                             oracle内存结构SGA
http://blog.csdn.net/robinson_0612/article/details/5534832                  oracle10gSGA自动化管理
http://soft.chinabyte.com/database/397/12311397.shtml                       oracle体系结构介绍
http://blog.csdn.net/yujin2010good/article/details/7709120                  oracle体系结构详解
http://blog.csdn.net/tianlesoftware/article/details/5594080                  oracle内存架构详解
http://vb118.blog.163.com/blog/static/173933100201142531527355/              oracle sga