我们知道,内存结构是Oracle体系结构中最重要的部分之一。按照系统对内存使用方法的不同,可以分为系统全局区(SGA)、程序全局区(PGA)、排序区(Sort Area)、大池(Large Pool)、及java池(java Pool),本文我们先介绍一下Oracle 10g内存结构之系统全局区的内容,接下来我们就开始介绍这部分内容。
系统全局区(System Global Area)
它是一组为系统分配的内存共享结构,可以包含一个数据库实例的数据和控制信息。如果多个用户连接到一个实例,在实例的系统全局区中,数据可以被多个用户共享,所以又称共享全局区。系统全局区按其作用不同,可以分为数据缓冲区、日志缓冲区及共享池。
数据缓冲区:
数据缓冲区用于从磁盘读入的数据,供所有用户共享。
修改的数据、插入的数据存储在数据缓冲区中,修改完成或DBWR进程的其他条件引发时,数据被写入数据文件
数据缓冲区工作原理:
LRU (Least recently used):最近最少使用原则的缩写,是一种数据缓冲区的一种管理机制,,只保留最近数据,不保留旧数据。
Dirty:表示脏数据,脏数据是修改后还没有写到数据文件的数据。
Oracle10g 的数据库内存的设置参数不再由DB_BLOCK_BUFFERS确定,而是由oracle的新参数DB_CACHE_SIZE 和DB_nK_CACHE_SIZE确定,不同的数据段可以使用不同的数据块。大表可以存储在大的数据块表空间中,小表可以存储在小的数据块表空间中,以优化i/o性能。对于系统表空间、临时表空间、及其它默认设置的表空间,可以使用标准的数据块DB_BLOCK_SIZE确定。
标准数据块DB_BLOCK_SIZE用于系统表空间及默认表空间,其他表空间可以使用非标准数据块BLOCKSIZE(创建表空间时使用),其值分别为 2k 4k 8k 16k 32k ,非标准数据块的数据缓冲区使用参数DB_Nk_CACHE_SIZE确定。
需要注意的是BLOCKSIZE不得用于标准块。如果设置了DB_BLOCK_SIZE=2048,则不得设置DB_2K_CACHE_SIZE,标准块必须使用参数DB_CACHE_SIZE 来设置。同时可以在线修改数据缓冲区参数:SQL> alter system set db_2k_cache_size = 10M ;如果要查询数据缓冲区大小,可以如下:SQL> show parameter db。
在创建不同数据块表空间时,要使用参数BLOCKSIZE指出数据块的大小,同时在参数文件中要使用DB_Nk_CACHE_SIZE 进行配置,与BLOCKSIZE的个数相对应,否则会出现错误。
设置动态内存时,可以将多个参数全部写入参数文件,格式如下:
class="dp-xml">
- # cache and i/o
- DB_BLOCK_SIZE=4096
- DB_CACHE_SIZE=20971520
- DB_2K_CACHE_SIZE=8M
- DB_8K_CACHE_SIZE=4M
- ……..
其中,参数 DB_CACHE_SIZE 只适用于系统表空间、临时表空间、及默认表空间,DB_2K_CACHE_SIZE 适合 BLOCKSIZE 为2K的表空间。8K 也是一样的道理。
数据缓冲区对数据库德存取速度又直接影响。一般的缓冲区命中率应该在90% 以上。例如,使用数据字典 v$sysstat 计算数据缓冲区命中率:
- SQL> select a.value+b.value “logical_reads” , c.value “phys_reads”,
- Round(100* ( ( a.value+b.value)- c.value) /
- ( a.value+b.value ) ) “buffer hit radio “
- From v$sysstat a, v$sysstat b,v$sysstat c
- Where a.statistic#=38 and b.statistic#=39 and c.statistic#=40;
下面是计算数据缓冲命中率的另一种方法:
- SQL> select name, value
- From v$sysstat
- Where name in ( ‘session logical reads’,’physical reads’,physical reads direct’, ‘physical reads direct (lob)’);
其中:Session logical reads 为读的总量。Physical reads为从数据文件读。Physical reads direct 为从缓冲区读(不含lobs)。Physical reads direct (lobs) 为从缓冲区读(含lobs)。Hit Ratio = 1- ( ( physical reads- physical reads direct – physical reads direct(lob) ) /session logical reads) = 95%。
日志缓冲区
日志缓冲区用来存储数据库的修改信息。日志信息首先在日志缓冲区中产生,当日志缓冲区的日志达到一定数量时,由日志写入进程LGWR将日志数据写入日志文件组,再经过切换,由归档进程ARCH将日志数据写入归档介质。
日志缓冲区大小由参数LOG_BUFFER确定,要查询日志缓冲区大小可以用以下方法:
方法一:参数文件中:
- ……
- Processes = 150
- Parallel_max_servers = 5
- Log_buffer = 32768
- ……..
方法二:
- SQL> select name,value from v$parameter where name like ‘%buffer’;
方法三:
- SQL> show parameter log_buffer
对于日志缓冲区而言可以计算失败率,使用数据字典v$latch 计算日志缓冲区的失败率
- SQL>select name,gets,misses,immediate_gets,immediate_misses,
- Decode(gets,0,0,misses/gets*100) ratiol,
- Decode (immediate_gets+immediate_misses,0,0,
- immediate_misses/(immediate_gets+immediate_misses)*100) ratio2
- from v$latch
- where name in (‘redo allocation’, ‘redo copy’);
其中
Gets 表示成功等待日志缓冲区的次数。
Immediate gets 表示成功立即得到日志缓冲区的次数。
Immediate misses 表示未成功立即得到日志缓冲区的次数。
等待表示日志在进入日志缓冲区时,因为日志缓冲区过小而没有空闲空间,所以日志缓冲区的失败可以表示日志缓冲区是否足够大,不够大时,用户的日志写将产生等待过程。日志缓冲区的失败率应该小于1%。
此外,可以查询用户进程等待日志缓冲区时的次数,通过数据字典v$sysstat 得到:
- SQL> select name,value from v$sysstat
- Where name = ‘ redo buffer allocation retries’ ;
关于Oracle 10g内存结构之系统全局区的相关知识就介绍到这里了,希望本次的介绍能够对您有所收获!