Oracle内存结构研究-SGA篇 |
一、概述 在《Oracle内存 构造探究-PGA篇》一文中提到,PGA是一个服务器 历程的专用的私有内存区,而SGA则是共享内存区 。 SGA由多个 部分构成: 1, 固定SGA(Fixed SGA) 2, 块缓冲区(Db cache) 3, 重做日志缓冲区(Redo log buffer) 4, Java池(Java pool) 5, 大池(Large pool) 6, 共享池(Shared pool) 7, 流池(Stream pool) 有如下参数操纵共享池 有关组件大小: 1, JAVA_POOL_SIZE:操纵Java池大小 。 2, SHARED_POOL_SIZE:9i中操纵共享池中占用最大的 部分,10g以上操纵共享池大小 。 3, LARGE_POOL_SIZE:操纵大池大小 。 4, DB_*K_CACHE_SIZE:操纵不同块大小的缓冲区大小 。 5, LOG_BUFFER:操纵重做日志缓冲区大小 。 6, SGA_TARGET:10g以上操纵自动SGA内存治理的总内存大小 。 7, SGA_MAX_SIZE:操纵SGA 可以达到的最大大小,转变需重启数据库 。 下面将 详尽介绍各个 部分的作用和推举设置 。 二、SGA各组件作用 1, 固定SGA: 顾名思义,是一段不变的内存区,指向SGA中 其余 部分,Oracle通过它找到SGA中的 其余区, 可以 方便 了解为用于治理的一段内存区 。 2, 块缓冲区: 查问时,Oracle会先把从磁盘读取的数据放入内存,以后再 查问 有关数据时不用再次读取磁盘 。插入和更新时,Oracle会现在该区中缓存数据,之后批量写到硬盘中 。通过块缓冲区,Oracle 可以通过内存缓存 普及磁盘的I/O性能 。 块缓冲区中有三个区域: 默许池(Default pool):所有数据默许都在这里缓存 。 维持池(Keep pool):用来缓存需要 频繁重用的数据 。 回收池(Recycle pool):用来缓存很少重用的数据 。 原来惟独一个默许池,所有数据都在这里缓存 。这样会产生一个问题:大量很少重用的数据会把需重用的数据“挤出”缓冲区,造成磁盘I/O添加,运行速度 降落 。后来分出了 维持池和回收池依据是不是 时常重用来分别缓存数据 。 这三 部分内存区需要手动确定大小,而且中间没有共享 。例如: 维持池中已经满了,而回收池中还有大量空暇内存,这时回收池的内存不会 调配给 维持池 。 9i开始,还 可以设置db_nk_cache 。9i之前数据库不得不 使用 雷同的块大小 。9i开始同一个数据库 可以 使用多种块大小(2KB,4KB,8KB,16KB,32KB),这些块需要在各自的db_nk_cache中缓存 。假如为不同的表空间指定了不同的块大小,需要为其设置各自的缓冲区 。 3, 重做日志缓冲区(Redo log buffer): 数据写到重做日志文件之前在这里缓存,在以下状况中触发: 每隔3秒 缓存达到1MB或1/3满时 消费者提交时 缓冲区的数据写入磁盘前 4, Java池(Java pool): 在数据库中运行Java代码时用到这 部分内存 。例如:编写Java存储过程在服务器内运行 。需要 留神的是,该内存与常见的Java编写的B/S系统并没关系 。用JAVA语言 接替PL/SQL语言在数据库中写存储过程才会用到这 部分内存 。 5, 大池(Large pool): 下面三种状况 使用到大池: 并行执行: 存放 历程间的 信息缓冲区 RMAN:某些状况下用于磁盘I/O缓冲区 共享服务器模式:共享服务器模式下UGA在大池中 调配(假如设置了大池) 6, 共享池(Shared pool) 共享池是SGA中最主要的内存段之一 。共享池太大和太小都会严峻影响服务器性能 。 SQL和PL/SQL的解释 方案、代码,数据字典数据等等都在这里缓存 。 SQL和PL/SQL代码在执行前会进行“硬解析”来 获得执行 方案及权限验证等 有关辅助操作 。“硬解析”很费 工夫 。关于响应 工夫很短的 查问,“硬解析” 可以占到所有 工夫的2/3 。关于响应 工夫较长的统计等操作,“硬解析”所占用的 工夫比例会 降落众多 。执行 方案及所需的数据字典数据都缓存在共享池中,让后续 雷同的 查问 可以削减众多 工夫 。 不 使用“绑定变量”招致: 系统需要 花费大量的资源去解析 查问 。 共享池中的代码从不重用,系统 花费很大代价治理这 部分内存 。 关于共享变量的优缺陷 探讨已经超过了这篇文章的 规模, 方便来讲,响应 工夫短的 查问要 使用共享变量,响应 工夫长的统计不 使用共享变量 。 需要 留神的是,SHARED_POOL_SIZE参数在9i中操纵共享池中占用最大的 部分,10g以上操纵共享池总大小 。 7, 流池(Stream pool) 9iR2以上添加了“流”技术,10g以上在SGA中添加了流池 。流是用来共享和复制数据的工具 。 三、SGA设置 没有通用的设置,所有设置都要依据系统的负载、业务需要和硬件环境来进行调整 。这里只不过总结出大体的设定,幸免因SGA设置不当引起的问题 。 1,自动SGA内存治理 在Oracle 10g中引入了自动SGA内存治理 特点,DBA 可以设定SGA_TARGET告诉Oracle可用的SGA内存为多大,由Oracle依据系统负载来动态调整各组件大小,相应的数定会 保留在操纵文件中,使数据库重启后也记得各组件大小 。 需要 留神一下几点: 要 使用自动SGA内存治理,STATISTICS_LEVEL参数必须设为TYPICAL或ALL,系统自动收集相应的信息用来动态调整SGA设定 。 可以设定某个组件的值,Oracle 使用此值为该组件的最小大小 可动态调整的参数: DB_CACHE_SIZE,SHARED_POOL_SIZE,LARGE_POOL_SIZE,JAVA_POOL_SIZE 。 需手动设置的参数: LOG_BUFFER,STREAMS_POOL,DB_NK_CACHE_SIZE,DB_KEEP_CACHE_SIZE,DB_RECYCLE_CACHE_SIZE 。 2,手动SGA内存治理 1) 32bit和64bit 制约 在32位的操作系统中,Oracle最大可用内存为1.75g,也便是说SGA+PGA<=1.75g,超过这一 制约的内存将不会被Oracle用到 。 32位的Oracle 可以装到64位的操作系统上,64位的Oracle不 可以装到32位的操作系统上 。 2) 查看Oracle版本: SQL> select * from v$version; BANNER ---------------------------------------------------------------- Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod PL/SQL Release 10.2.0.1.0 - Production CORE 10.2.0.1.0 Production TNS for 32-bit Windows: Version 10.2.0.1.0 - Production NLSRTL Version 10.2.0.1.0 – Production 3) 各组件设置: JAVA_POOL_SIZE:假如没用到数据库端java的系统,30MB足够 。 LOG_BUFFER:默许为MAX(512KB,128KB*CPU个数) 。普通系统1MB足够,运行大型事务的系统 可以设为2MB,让1/3满写入日志文件时 可以 接续写入缓冲,再大也没有 意思 。 SHARED_POOL_SIZE:过大过小都会严峻影响系统性能,1GB内存 可以设为100MB,2GB内存可设为150MB,4GB内存可设为300MB 。共享池命中过低首先要调整的是 利用程序而不是 扩充共享池 。 使用绑定变量 可以削减共享池需要、 普及命中率,削减共享池治理 累赘和LATCH竞争 。 LARGE_POOL_SIZE: 使用专用服务模式可设为30MB,除非必要,否则不 提议 使用共享服务器模式 。 DB_CACHE_SIZE:除去上述内存外 其余可用内存都 调配给该区域 。 总结 32位Oracle: 1G内存:SHARED_POOL_SIZE=100MB,DB_CACHE_SIZE=0.5GB; 2G内存:SHARED_POOL_SIZE=150MB,DB_CACHE_SIZE=1.25GB; 64位Oracle 4G内存:SHARED_POOL_SIZE=200MB,DB_CACHE_SIZE=2.5GB; 8G内存:SHARED_POOL_SIZE=400MB,DB_CACHE_SIZE=5GB; 12G内存:SHARED_POOL_SIZE=500MB,DB_CACHE_SIZE=8GB 再次强调,以上只不过幸免因SGA设置不当引起问题的大体设置,需要依据具体的系统负载和业务逻辑 联合Stackpack等工具细调 。 |