把Oracle内存结构说透

引言html

Oracle Server由两个实体组成:实例(instance)与数据库(database)。java

实例(instance)包括:内存结构(SGA、PGA)和用户进程,实例为用户同数据库交互的媒介。算法

数据库(database)包括:物理结构(数据文件、日志文件、控制文件等)和逻辑结构(表空间、段、区、块、等)sql

Oracle内存结构与oracle性能息息相关,内存结构是CPU与IO桥梁,内存结构对于数据库来讲很是重要。数据库

1、内存结构概述缓存

内存结构主要有:系统全局区(System Global Area简称SGA)和(Process Global Area简称PGA)组成。服务器

系统全局区SGA:当启动实例的时候分配,是一组包含一个Oracle实例的数据和控制信息的共享内存结构。网络

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

2、系统全局区SGAoracle

1.SGA由几个内存结构组成

数据高速缓冲区(Database Buffer Cache)

共享池(Shared Pool)

重作日志缓冲区(Redo Log Cache)

其余结构(如锁管理)

附图:

SGA

2.SGA可选内存结构

大池

JAVA池

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

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

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

2

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

   △动态指定大小

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

3

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

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

   △java命令须要分析的环境

   △安装使用java须要

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

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

4

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

3、进程全局区(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

相关文章
相关标签/搜索