oracle 10g内存分配,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的个数相对应,否则会出现错误。

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

# 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内存结构之系统全局区的相关知识就介绍到这里了,希望本次的介绍能够对您有所收获!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值