Oralce的内存结构
<div id="cnblogs_post_body">1 Oracle具有以下基本的内存结构1> 软件程序代码区
2> 系统全局区
3> 程序全局区
4> 排序区
1.1 软件程序代码区(Software Code Area)
软件程序代码区是一块用于存放那些正在运行和可以被运行的Oracle本身程序的内存区域,而这块内存区域是独立且受保护的区域,通常软件程序代码区的大小是固定的,只有在Oracle进行了版本升级或重新安装后才会改变。在不同操作系统下,这部分区域所要求的大小也不同。软件程序代码区的重点如下。
软件程序代码区是只读的,可以被安装成共享的或非共享的,在可能的情况下,Oracle本身的程序是可共享的,这样所有的Oracle用户都可以直接使用这些程序,而不需要用户各自保存一份在自身的内存中,从而可以节省大量内存空间。如果一台服务器上有多个实例,这些实例可以使用同一个Oracle程序,这也就是为何当一台服务器上安装了一套Oracle软件后,可以使用这套软件配置多个Oracle数据库。
1.2 系统全局区(System Global Area)
1.2.1 概述
之所以称为系统全局区(System Global Area,SGA),是因为其中的数据可以被Oracle所在的操作系统上的所有会话用户和程序共享,SGA有几个基本的特性,如下所示:
1> SGA由系统内存构成,其中存储了数据、用户信息和控制信息。
2> 一个SGA只能服务于一个实例,也就是说,当一台服务器上有多个实例运行时,每个实例都有一个自己专用的SGA,虽然同一台服务器上SGA都是来自于操作系统上的内存,但实例之间不能相互访问对方的SGA。
3> SGA是共享的,当有多个用户使用到这个实例,SGA中的信息可以被所有用户同时使用,当然这牵涉了锁等问题。
4> Oracle进程和一个SGA就可以构成一个Oracle实例。当实例启动时,Oracle会自动从操作系统中分配设置好的内存给SGA,而当实例关闭时,操作系统就会回收这些内存。
以下就是当实例启动后,显示已经分配了SGA的架构,如图2-1所示。
http://pic002.cnblogs.com/images/2012/460194/2012102611045711.png
图一:启动数据库实例
解释:
Total System Global Area:SGA的总大小
Fixed Size:存储了SGA各部分组件信息,作为引导SGA创建的区域,此块区域就被固的
Variable Size:共享池、Java池、大型池和流池等的配置总和
Database Buffers:数据库高速缓冲区的大小。
Redo Buffers:重做日志缓冲区的大小。
1.2.2 SGA的组成
SGA的组成图如下:
http://pic002.cnblogs.com/images/2012/460194/2012102611063871.jpg
系统全局区由以下几部分组成
1> 数据库高速缓冲区(Database Buffer Cache)
2> 重做日志缓冲区(Redo Log Buffer)
3> 共享池(Shared Pool)
4> Java池(Java Pool)
5> 大型池(Large pool)
6> 流池(Stream Pool)
7> 固定SGA(Fix SGA)
1.2.2.1 数据库高速缓冲区(Database Buffer Cache)
Oracle有一个很重要的概念,就是除非到了必要的时候,否则不会等待磁盘I/O,因为磁盘I/O是计算机系统运行中最慢的一个部分,所以,所执行的I/O越少越好数据库高速缓冲区(Database Buffer Cache)即是应此概念而规划出来的。
数据库高速缓冲区的主要功能是用来暂时存放最近读取自数据库中的数据,也就是数据文件(Data File)内的数据,而数据文件是以数据块(Block)为单位,因此,数据库高速缓冲区中的大小是以块为基数。当用户通过应用程序第一次向Oracle数据库发出查询请求时,Oracle会先在数据库高速缓冲区内寻找该数据,如果有该请求所需要的数据,就直接从数据库高速缓冲区传回给用户,这称为缓存命中(Cache Hit),这样就可以减少硬盘上的I/O次数。如果Oracle发现用户要的数据并不在数据库高速缓冲区里,就称为缓存失误(Cache Miss),Oracle会从数据库中读取所需要的数据块,先放入数据库高速缓冲区中,再传送给用户,如图二所示。
http://pic002.cnblogs.com/images/2012/460194/2012102611071343.jpg
图二:数据库高速缓冲区
有关数据库高速缓冲区命中率的计算方式如下:
<div class="cnblogs_code">1 SELECT 1 - (PHY.VALUE / (CUR.VALUE + CON.VALUE)) "CACHE HIT RATIO"2 FROM V$SYSSTAT CUR,3 V$SYSSTAT CON,4 V$SYSSTAT PHY5 WHERE CUR.NAME = 'db block gets'6 AND CON.NAME = 'consistent gets'7 AND PHY.NAME = 'physical reads';
页:
[1]