ORACLE内存管理简述1
来源:互联网 发布:windows损坏文件 编辑:程序博客网 时间:2024/05/20 18:43
接触ORACLE一段时间了,假如在学校的话进行一个ORACLE的考试,出一个大题,简述下ORACLE的内存结构,字数不限制。
下面来解答下:ORACLE的内存由PGA、SGA、UGA组成
由SGA、PGA、UGA构成
UGA和PGA、SGA的关系
当采用共享服务器连接模式的时候,UGA在SGA中,当采用专用服务器连接的时候UGA在PGA中,从9i R1开始就分为两种方式管理
PGA
PGA的手动管理和自动管理
- 手动:sort_area_size、sort_area_retatined_size、hash_area_size排序区和散列区这些参数需要手动设置。9i中共享模式下必须手动设置这些参数,因为无法用自动管理。
- 自动:对于workarea_size_plicy 参数,在9i R1中是manual,在9i R2中默认是auto;10G也应该是auto;通过设置workarea_size_plicy 为auto,pga_aggregate_target为一个固定的数据来开启9i和10G中的pga自动管理。如果11G启用了memory_target参数为auto(PGA和SGA都自动管理),则pga_aggregate_target 一般显示为0。
SGA
其中SGA由以下几个主要部分构成和不同数据库区别
在v$sgastat中可以看到几个组件的大小
- (shared_pool_size)共享池 Shared Pool
- (db_*_catch_size)数据库缓冲区 Buffer Catch:存数据块缓存,必须把数据块读到此处才能进行操作。针对每个分了5个类型的缓存中2/4/8/16/32 K,由db_16k_cache_size、db_2k_cache_size、db_32k_cache_size、db_4k_cache_size、db_8k_cache_size、db_cache_size、db_keep_cache_size这8个参数来控制大小
- (java_pool_size)java池 Java Pool
- (log_buffer)重做日志缓存 Log Buffer
- 大池:在模拟I/O异步的时候,RMAN会用到;并行查询是,各个进行交换信息的地方;采用共享架构是也会用到这个地方。 6. 流池(从10G开始,用于数据库间传输)
SGA在9i、10G、11G数据库中管理区别:
在9i中以上各个组件手动设置大小:
9i中没有SGA自动管理的功能,必须进行手动设置各个组件大小
SQL> show parameter cache_sizeNAME TYPE VALUE------------------------------------ ----------- ------------------------------db_16k_cache_size big integer 0db_2k_cache_size big integer 0db_32k_cache_size big integer 0db_4k_cache_size big integer 0db_8k_cache_size big integer 0db_cache_size big integer 12884901888db_keep_cache_size big integer 0db_recycle_cache_size big integer 0SQL> show parameter pool_sizeNAME TYPE VALUE------------------------------------ ----------- ------------------------------global_context_pool_size stringjava_pool_size big integer 67108864large_pool_size big integer 167772160olap_page_pool_size integer 4194304shared_pool_size big integer 3221225472SQL> show parameter log_bufferNAME TYPE VALUE------------------------------------ ----------- ------------------------------log_buffer integer 104857600SQL>
从10G开始有自动管理sga_target参数:
在10G中可以通过sga_target来
sys@ALMTEST> show parameter sgaNAME TYPE VALUE------------------------------------ ----------- ------------------------------lock_sga boolean FALSEpre_page_sga boolean FALSEsga_max_size big integer 8G --用来设置SGA自动管理sga_target big integer 8G --用来设置SGA可以达到的最大大小-- 在10G中是没有memory_target 、shared_memory_address 这2个参数的sys@ALMTEST> show parameter memNAME TYPE VALUE------------------------------------ ----------- ------------------------------hi_shared_memory_address integer 0shared_memory_address integer 0
11G开始有了全部内存的自动管理,只要设置一个参数memory_target 就OK了
设置了这个参数后,自动调整PGA和SGA的大小,
idle> show parameter sgaNAME TYPE VALUE------------------------------------ ---------------------- ------------------------------lock_sga boolean FALSEpre_page_sga boolean FALSEsga_max_size big integer 812Msga_target big integer 0idle> show parameter memNAME TYPE VALUE------------------------------------ ---------------------- ------------------------------hi_shared_memory_address integer 0memory_max_target big integer 812Mmemory_target big integer 812Mshared_memory_address integer 0idle>
各个数据库版本粒度大小单位是一般是16M或者4M,这个颗粒度大小是动态变化的
例如下面的两个例子分别取自9i和10G的值,如果想分配一个5MB的java池,颗粒大小是4M,则实际上分配的java池大小为8M,集按照颗粒来分配的
SQL> select component,granule_size from v$sga_dynamic_components;COMPONENT GRANULE_SIZE---------------------------------------------------------------- ------------shared pool 16777216large pool 16777216buffer cache 16777216
10G
sys@ALMTEST> select component,granule_size from v$sga_dynamic_components;COMPONENT GRANULE_SIZE---------------------------------------------------------------- ------------shared pool 16777216large pool 16777216java pool 16777216streams pool 16777216DEFAULT buffer cache 16777216KEEP buffer cache 16777216RECYCLE buffer cache 16777216DEFAULT 2K buffer cache 16777216DEFAULT 4K buffer cache 16777216DEFAULT 8K buffer cache 16777216DEFAULT 16K buffer cache 16777216DEFAULT 32K buffer cache 16777216ASM Buffer Cache 1677721613 rows selected.sys@ALMTEST>
11G中的颗粒大小是16M,这个颗粒大小是动态变化的,一般SGA越大,颗粒也就越大。
idle> /COMPONENT GRANULE_SIZE------------------------------------------------------- ------------shared pool 4194304large pool 4194304java pool 4194304streams pool 4194304DEFAULT buffer cache 4194304KEEP buffer cache 4194304RECYCLE buffer cache 4194304DEFAULT 2K buffer cache 4194304DEFAULT 4K buffer cache 4194304DEFAULT 8K buffer cache 4194304DEFAULT 16K buffer cache 4194304DEFAULT 32K buffer cache 4194304Shared IO Pool 4194304ASM Buffer Cache 419430414 rows selected.idle>
SGA各个组件的作用
共享池的组成 (以下几部分占得比例大小由oracle自动调整)
- 库缓存:存放执行计划,当相同的sql过来的时候可以直接在这拿到执行计划,不用再解析一次;还存放最近用的sql、pl/sql 语句,
- 数据字典缓存:提高硬解析的性能,减少硬解析的物理读,存放最近用到的对象的定义
- 结果集团缓存(11G新增):这儿和缓存区缓存有点像,我理解的是这儿放的是逻辑数据,拿出来就能用,而缓冲区缓存放的是热数据块,也需要进行逻辑读的。
redo缓存区
当对数据进行修改的时候都会产生针对这个修改一个重做项目(Redo Entry),先放到日志缓冲区中,然后再有LGWR进程将日志缓存区的REDO Entry 写入到联机日志中,如果实例崩溃,则下次重新启动实例时,依照联机日志中的Redo Entry 再执行一次,便可以将事务全数恢复。
在下面几个情况下会发生向磁盘的输出:
1. 每3秒
2. commit事务
3. 要求LGWR切换日志
4. 缓冲区1/3满,或者超过了1MB的缓存日志数据
即便Redo Entry在写到联机日志前就崩溃了,日志缓冲区的所有Redo Entry 丢失了,也不会造成已经提交的事务无法恢复,因为实例要求事务提交前,必须将事务提交的Redo Entry 写到联机重做日志文件后,才回复事务已经提交的信息,也就是说当用户看到commit成功的消息后,Redo Entry已经写入到联机日志当中了。
当实例正常停止的时候,没有写入到联机日志的Redo Entry 一定属于目前正在运行的事务,既然未提交,那么可以就不恢复。
由LOG_BUFFER这参数决定,必须是文件系统的倍数。用 select max(lebsz) log_blk_size from sys.x$kccle 查文件系统快的大小。
这个大小有log_buffer参数来决定,但是不是唯一决定的还和操作系统数据库的版本及其他参数设置有关系。一般都是很小小的,几MB而已。
块缓冲区
- ORACLE内存管理简述1
- oracle SGA内存结构简述
- Oracle的内存管理
- oracle 内存管理PGA
- oracle 内存管理SGA
- ORACLE自动管理内存
- Oracle 自动内存管理
- Oracle 内存自动管理
- Oracle 内存管理
- oracle 内存管理 总结
- oracle内存管理
- Oracle 内存管理SGA
- oracle 自动内存管理
- Oracle DB管理内存
- oracle内存管理参数
- oracle内存管理
- oracle 内存管理
- oracle内存自动管理
- android post提交数据
- Android studio提交SVN需要忽略的文件
- 设计模式—装饰器模式(Decorator)
- leetcode 做题记录
- Jetty实战之 安装 运行 部署
- ORACLE内存管理简述1
- php高级函数【递归函数】
- 记录下过年要写的博客
- Plugin is too old, please update to a more recent version 解决办法 2016.1.2
- 使用keytool生成证书和秘钥
- /bin/sh^M:损坏的解释器: 没有那个文件或目录
- 163,如何实现懒加载——getter方法
- 文章标题
- [从头学数学] 第22节 表内乘法(一)