LinuxEye - Linux系统教程

LinuxEye - Linux系统教程

当前位置: 主页 > 数据库 >

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

时间:2012-12-11 10:25来源:CU 编辑:CU 点击:
内存结构是Oracle体系结构中最重要的部分之一。按照系统对内存使用方法的不同,可以分为系统全局区(SGA)、程序全局区(PGA)、排序区(Sort Area)、大池(Large Pool)、及java池(j
  内存结构是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的个数相对应,否则会出现错误。

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

  # 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';

转载请保留固定链接: https://linuxeye.com/database/1024.html

------分隔线----------------------------
标签:Oracle内存结构
栏目列表
推荐内容