对于oracle的内存的管理截止到iR都是相当重要的环节管理不善将可能给数据库带来严重的性能问题下面我们将一步一步就内存管理的各个方面进行探讨 l 概述 oracle的内存可以按照共享和私有的角度分为系统全局区和进程全局区也就是SGA和PGA(process global area or private global area)对于SGA区域内的内存来说是共享的全局的在UNIX上必须为oracle设置共享内存段(可以是一个或者多个)因为oracle在UNIX上是多进程而在WINDOWS上oracle是单进程(多个线程)所以不用设置共享内存段PGA是属于进程(线程)私有的区域在oracle使用共享服务器模式下(MTS)PGA中的一部分也就是UGA会被放入共享内存large_pool_size中 对于SGA部分我们通过sqlplus中查询可以看到 SQL> select * from v$sga; NAME VALUE Fixed Size Variable Size Database Buffers Redo Buffers Fixed Size oracle 的不同平台和不同版本下可能不一样但对于确定环境是一个固定的值里面存储了SGA各部分组件的信息可以看作引导建立SGA的区域 Variable Size 包含了shared_pool_sizejava_pool_sizelarge_pool_size等内存设置和用于管理数据缓沖区等内存结构的hash table块头信息(比如x$bh消耗内存)等 Database Buffers 指数据缓沖区在i中包含default poolbuffer_pool_keepbuffer_pool_recycle三部分内存在i中包含db_cache_sizedb_keep_cache_sizedb_recycle_cache_sizedb_nk_cache_size这里要注意在i中三部分内存总和为db_block_buffers*db_block_size Redo Buffers 指日志缓沖区log_buffer在这里要额外说明一点的是对于v$parameterv$sgastatv$sga查询值可能不一样v$parameter里面的值是指用户在初始化参数文件里面设置的值v$sgastat是oracle实际分配的日志缓沖区大小(因为缓沖区的分配值实际上是离散的也不是以block为最小单位进行分配的)v$sga里面查询的值是在oracle分配了日志缓沖区后为了保护日志缓沖区设置了一些保护页通常我们会发现保护页大小大约是k(不同环境可能不一样)参考如下内容 SQL> select substr(name) namesubstr(value) value from v$parameter where name = log_buffer; NAME VALUE log_buffer SQL> select * from v$sgastat ; POOL NAME BYTES fixed_sga buffer_cache log_buffer SQL> select * from v$sga; NAME VALUE Fixed Size Variable Size Database Buffers Redo Buffers 关于各部分内存的作用参考oracle体系结构在此不再叙述 |