The important thing in life is to have a great aim , and the determination

常用链接

统计

IT技术链接

保险相关

友情链接

基金知识

生活相关

最新评论

Oracle 10g内存结构之系统全局区简介

我们知道,内存结构是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的个数相对应,否则会出现错误。

设置动态内存时,可以将多个参数全部写入参数文件,格式如下:

  1. # cache and i/o  
  2.  DB_BLOCK_SIZE=4096 
  3.  DB_CACHE_SIZE=20971520 
  4.  DB_2K_CACHE_SIZE=8M 
  5.  DB_8K_CACHE_SIZE=4M 
  6.  …….. 

其中,参数 DB_CACHE_SIZE 只适用于系统表空间、临时表空间、及默认表空间,DB_2K_CACHE_SIZE  适合 BLOCKSIZE 为2K的表空间。8K 也是一样的道理。

数据缓冲区对数据库德存取速度又直接影响。一般的缓冲区命中率应该在90% 以上。例如,使用数据字典 v$sysstat 计算数据缓冲区命中率:

  1. SQL> select a.value+b.value “logical_reads” , c.value “phys_reads”,  
  2.       Round(100* ( ( a.value+b.value)- c.value) /  
  3.       ( a.value+b.value ) ) “buffer hit radio “  
  4.       From v$sysstat a, v$sysstat b,v$sysstat c  
  5.       Where a.statistic#=38 and b.statistic#=39 and c.statistic#=40; 

下面是计算数据缓冲命中率的另一种方法:

  1. SQL> select name, value  
  2.       From v$sysstat  
  3.       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确定,要查询日志缓冲区大小可以用以下方法:

方法一:参数文件中:

  1.  ……  
  2.  Processes = 150 
  3.  Parallel_max_servers = 5 
  4. Log_buffer = 32768 
  5. …….. 

方法二:

  1. SQL> select name,value from v$parameter where name like ‘%buffer’; 

方法三:

  1. SQL> show parameter log_buffer 

对于日志缓冲区而言可以计算失败率,使用数据字典v$latch 计算日志缓冲区的失败率

  1. SQL>select name,gets,misses,immediate_gets,immediate_misses,  
  2.      Decode(gets,0,0,misses/gets*100) ratiol,  
  3.      Decode (immediate_gets+immediate_misses,0,0,  
  4. immediate_misses/(immediate_gets+immediate_misses)*100)   ratio2  
  5.      from v$latch  
  6.      where name in (‘redo allocation’, ‘redo copy’); 

其中

Gets 表示成功等待日志缓冲区的次数。

Immediate gets 表示成功立即得到日志缓冲区的次数。

Immediate misses 表示未成功立即得到日志缓冲区的次数。

等待表示日志在进入日志缓冲区时,因为日志缓冲区过小而没有空闲空间,所以日志缓冲区的失败可以表示日志缓冲区是否足够大,不够大时,用户的日志写将产生等待过程。日志缓冲区的失败率应该小于1%。

此外,可以查询用户进程等待日志缓冲区时的次数,通过数据字典v$sysstat 得到:

  1. SQL> select name,value from v$sysstat  
  2.       Where name = ‘ redo buffer allocation retries’ ; 

关于Oracle 10g内存结构之系统全局区的相关知识就介绍到这里了,希望本次的介绍能够对您有所收获!

posted on 2014-05-17 23:31 鸿雁 阅读(191) 评论(0)  编辑  收藏 所属分类: 数据库


只有注册用户登录后才能发表评论。


网站导航: