日期:2014-05-16  浏览次数:20364 次

Oracle 10g SGA结构

1.实例与数据库实例(instance) 运行中的数据库,即内存中的数据库。组成:SGA(system global area + background process)Show parameter instance_name;数据库? 操作系统中数据库文件的集合。Show paramter db_name;两者关系:通常情况一个实例对应一个数据库多个实例对应一个数据库,例OPS(oracle parallel server) & RAC(双机)。

?? 2.SGA是一组包含着一个oracle实例的数据和控制信息的共享内存结构。
?? ▲SGA主要包含6类缓冲:
??? 1,??????? 块缓冲区(Db_buffer_cache)
??? 2,??????? 共享池(Shared_pool)
??? 3,??????? 重做日志缓冲区(Redo_log_buffer)
??? 4,??????? 大池(Large_pool)
??? 5,??????? Java池(Java_pool)
??? 6,??????? 流池(Streams_pool)
?? ▲SGA参数:查看 SQL> show parameter sga;
? NAME???????????????????????????????? TYPE??????? VALUE------------------------------------ ----------- ------------------------------------------------?pre_page_sga?????????????????? boolean???? FALSE(启动是否将全部sga区都绑定到物理内存,而不使用swap。)

? lock_sga??????????????????????????? boolean???? FALSE(运行过程中是否也将全部sga区都绑定到物理内存,而不使用swap。)

sga_max_size?????????????????? big integer 164M (sga区总大小上限值)

sga_target??????????????????????? big integer 160M

Sga_target启用自动共享内存管理ASMM(automatic shared memory management),分配给ASMM的内存主要包括db_cache_size/db_buffer_cache、shared_pool、large_pool_size、java_pool_size。该四项和应小于sga_max_size,并尽量接近。

sga内存按颗粒大小granule_size分配内存,若手工分配非整数,则自动凑为整数倍。

SQL> select name,bytes from v$sgainfo where name='Granule Size';

NAME????????????????????????????????? BYTES-------------------------------- ----------

Granule Size??????????????????????? 4194304

Sga? 1G ,8M for win,16M for other

SQL>select current_size from v$buffer_pool;查看db_cache_size当前实际大小(单位M)

CURRENT_SIZE

------------????????

92

SQL> select pool,sum(bytes) from v$sgastat group by pool;(查看shared_pool,large_pool,java_pool当前实际大小)

POOL????????????? SUM(BYTES)

------------?????? ----------?????????????

????????????????????? 104855308

java pool??????? 4194304

shared pool??? 58725572

large pool?????? 8388608

v$sgastat :这个视图比较重要。它记录了关于sga的统计信息。包含三个字段:Name(SGA内存区的名字);Bytes(内存区的大小,单位为字节);Pool(这段内存所属的内存池)。这个视图尤其重要的是,它详细记录了个各个池(Pool)内存分配情况。

修改: alter system set sga_target=158M scope=both;
▲ SQL> show sga;

Total System Global Area? 171966464

bytesFixed Size????????????????? 1218364

bytesVariable Size????????????? 62916804

bytesDatabase Buffers????????? 100663296

bytesRedo Buffers??????????????? 7168000

bytesfixes size : oracle 的不同平台和不同版本下可能不一样,但对于确定环境是一个固定的值,里面存储了 SGA 各部分组件的信息,Oracle通过它找到SGA中的其他区,可以简单理解为用于管理的一段内存区。Variable Size : 包括 shared_pool? ,large_pool,,java_pool 管理DB_BLOCK_BUFFERS 的内存,管理控制文件信息的内存,等等其他管理和控制 oracle 内部结构的内存。

?????? 3. db_buffer_cache查询时,会先把从磁盘读取的数据放入内存,以后再查询相关数据时不用再次读取磁盘而先到db_buffer_cache中来寻找。插入和更新时,会现在该区中缓存数据,之后批量写到硬盘中。通过块缓冲区,可以通过内存缓存提高磁盘的I/O性能。Db_buffer_cache缓冲区中有三个区域:
???? 默认池(Default pool):所有数据默认都在这里缓存。
???? 保持池(Keep pool):用来缓存需要多次重用的数据。(该缓存不参与ASMM,先进先出的方式从MRU移动到LRU端,无空闲缓冲,LRU端最久未使用数据被调出缓存)
???? 回收池(Recycle pool):用来缓存很少重用的数据。(该缓存不参与ASMM,recycle_pool满后,读取的数据不被缓存,以节省开销)
原来只有一个默认池,所有数据都在这里缓存。这样会产生一个问题:大量很少重用的数据会把需重用的数据“挤出”缓冲区,造成磁盘I/O增加,运行速度下降。后来分出了保持池和回收池根据是否经常重用来分别缓存数据。
?????? 这三部分内存区需要手动确定大小,并且之间没有共享。例如:保持池中已经满了,而回收池中还有大量空闲内存,这时回收池的内存不会分配给保持池。
?????? 9i开始,还可以设置db_nk_cache。9i之前数据库只能使用相同的块大小。9i开始同一个数据库可以使用多种块大小(2KB,4KB,8KB,16KB,32KB),这些块需要在各自的db_nk_cache中缓存。如果为不同的表空间指定了不同的块大小,需要为其设置各自的缓冲区。


??? 两个不同的列表管理待写列表(write list):包含已被修改,但尚未写入disk的脏缓存块。最近最少使用列表(least recently userd/LRU list):包含空闲缓存块,命中缓存块,及还未移入write list的脏缓存块。Default pool工作方式:当oracle进程访问一块缓冲区后,会将该缓冲区移动到LRU列表的MRU(most recently userd最近用的即热端),随着更多被访问的缓冲区移动到LRU列表的热端,较早前被访问过的缓冲区就向LRU列表的LRU(least recently used冷端)移动。当user process 执行FTS(full table scan全表扫描)时,数据首次将会从disk被读入缓冲区,之后将该缓冲区移动到LRU列表的LRU端而非MRU端),以使这些通常暂时需要的全表扫描数据所占的缓冲区能被尽快地移出数据缓冲区,为其他使用频繁更高的数据块腾出空间。


SQL> select component,current_size from v$sga_dynamic_components;

??? 如何