• 1. Oracle内存分配与参数设置基本初始化参数介绍 内存分配与初始化参数的设置
  • 2. 基本初始化参数的功能 sga_max_size(SGA) : 说明 : 指定例程存活期间所占用的系统全局区的最大大小。 值范围 : 0 到各操作系统所允许的最大值。请注意, 由于该参数值的最小值在启动时已经调整完毕, 因而它无关紧要。 默认值 : 如果未指定值, sga_max_size 的默认值将与启动时 SGA 的最初大小 (比如说 X) 相同。该大小取决于 SGA 中各种池的大小, 如缓冲区高速缓存, 共享池, 大型池等。如果指定的值小于 X, 则所使用的 sga_max_size 的值将为 X。也就是说, 它是 X 与用户指定的 sga_max_size 值两者之间的较大值。
  • 3. pga_aggregate_target (PGA ): 说明 : 指定连接到例程的所有服务器进程的目标 PGA 总内存。请在启用自动设置工作区之前将此参数设置为一个正数。这部分内存不驻留在 SGA 中。数据库将此参数值用作它所使用的目标 PGA 内存量。设置此参数时, 要将 SGA 从可用于 Oracle 例程的系统内存总量中减去。然后可将剩余内存量分配给 pga_aggregate_target。 值范围 : 整数加字母 K, M 或 G, 以将此限值指定为千字节, 兆字节或千兆字节。最小值为 10M, 最大值为 4000G 默认值 : "未指定", 表示完全禁用对工作区的自动优化。
  • 4. processes : 说明 : 指定可同时连接到一个 Oracle Server 上的操作系统用户进程的最大数量。该值应允许执行所有后台进程, 如 :作业队列 (SNP) 进程和并行执行 (Pnnn) 进程。 值范围 : 6 到根据操作系统而定的一个值。 默认值 : 由 PARALLEL_MAX_SERVERS 确定
  • 5. sessions : 说明 : 指定用户会话和系统会话的总量。默认数量大于 PROCESSES, 以允许递归会话。 值范围 : 任何整数值。 默认值 : 派生 (1.1 * PROCESSES + 5)
  • 6. 内存分配与初始化参数的设置 SGA内参数设置 Log_buffer Large_pool_size Java_pool_size shared_pool_size Data buffer
  • 7. Log_buffer 对于日志缓冲区的大小设置,通常我觉得没有过多的建议,因为参考LGWR写的触发条件之后,我们会发现通常超过3M意义不是很大。作为一个正式系统,可能考虑先设置这部分为log_buffer=1—3M 大小,然后针对具体情况再调整。
  • 8. Large_pool_size 对于大缓冲池的设置,假如不使用MTS,建议在20—30M 足够了。这部分主要用来保存并行查询时候的一些信息,还有就是RMAN 在备份的时候可能会使用到。如果设置了MTS,则由于UGA部分要移入这里,则需要具体根据server process数量和相关会话内存参数的设置来综合考虑这部分大小的设置。
  • 9. Java_pool_size 假如数据库没有使用JAVA,我们通常认为保留10—20M大小足够。事实上可以更少,甚至最少只需要32k,但具体跟安装数据库的时候的组件相关(比如http server)。
  • 10. shared_pool_size 这是迄今为止最具有争议的一部分内存设置。按照很多文档的描述,这部分内容应该几乎和数据缓冲区差不多大小。但实际上情况却不是这样的。首先我们要考究一个问题,那就是这部分内存的作用,它是为了缓存已经被解析过的SQL,而使其能被重用,不再解析。这样做的原因是因为,对于一个新的SQL(shared_pool 里面不存在已经解析的可用的相同的SQL),数据库将执行硬解析,这是一个很消耗资源的过程。而若已经存在,则进行的仅仅是软分析(在共享池中寻找相同SQL),这样消耗的资源大大减少。所以我们期望能多共享一些SQL,并且如果该参数设置不够大,经常会出现ora-04031错误,表示为了解析新的SQL,没有可用的足够大的连续空闲空间,这样自然我们期望该参数能大一些。但是该参数的增大,却也有负面的影响,因为需要维护共享的结构,内存的增大也会使得SQL 的老化的代价更高,带来大量的管理的开销,所有这些可能会导致CPU 的严重问题。在一个充分使用绑定变量的比较大的系统shared_pool_size 的开销通常应该维持在300M 以内。除非系统使用了大量的存储过程、函数、包,比如oracle erp 这样的应用,可能会达到500M甚至更高。于是我们假定一个1G内存的系统,可能考虑设置该参数为100M,2G 的系统考虑设置为150M,8G 的系统可以考虑设置为200—300M。
  • 11. Data buffer 现在我们来谈数据缓冲区,在确定了SGA 的大小并分配完了前面部分的内存后,其余的,都分配给这部分内存。通常,在允许的情况下,我们都尝试使得这部分内存更大。这部分内存的作用主要是缓存 DB BLOCK,减少甚至避免从磁盘上获取数据,在8i中通常是由 db_block_buffers*db_block_size 来决定大小的。如果我们设置了buffer_pool_keep 和buffer_pool_recycle,则应该加上后面这两部分内存的大小。
  • 12. 实际操作中可以根据ORACLE提供的图形界面来设置前面介绍的那些参数(如下图)oracle内存分配可以参考下面的公式: OS使用内存+SGA+并发执行进程数*(sort_area_size+hash_ara_size+2M) < 0.7*总内存
  • 13. 32bit 和 64bit 的问题 对于oracle 来说,存在着32bit与64bit的问题。这个问题影响到的主要是SGA的大小。在32bit的数据库下,通常oracle只能使用不超过1.7G的内存,即使我们拥有12G的内存,但是我们却只能使用1.7G,这是一个莫大的遗憾。假如我们安装64bit的数据库,我们就可以使用很大的内存,我们几乎不可能达到上限。但是64bit 的数据库必须安装在64bit 的操作系统上,可惜目windows 上只能安装32bit的数据
  • 14. ORACLE提供了共享池的建议大小,这个值设置到大小因子为1的建议内存大小就可以了。
  • 15. 高速缓冲区的建议设置,如下图40M哪个点就可以了,但很多情况这个建议并不准确,可以参考我下一页给的处理方式
  • 16. 针对数据缓冲区的大小来看。首先观察命中率数据缓冲区命中率 SQL> select value from v$sysstat where name ='physical reads'; VALUE ---------- 14764 SQL> select value from v$sysstat where name ='physical reads direct'; VALUE ---------- 50 SQL> select value from v$sysstat where name ='physical reads direct (lob)'; VALUE ---------- 0 SQL> select value from v$sysstat where name ='consistent gets'; VALUE ---------- 167763 SQL> select value from v$sysstat where name = 'db block gets'; VALUE ---------- 14305 这里命中率的计算应该是 令 x = physical reads direct + physical reads direct (lob) 命中率 =100 - ( physical reads - x) / (consistent gets + db block gets - x)*100 通常如果发现命中率低于90%,则应该调整应用可可以考虑是否增大数据缓冲区
  • 17. SGA中的其他两项可以适当给点,两者和起来建议不要超过50M
  • 18. PGA根据大小可以根据ORACLE提供的建议值,设置到命中率达到100%的哪个点就可以了。
  • 19. 关于前面介绍的processess 和 sessions也可以在ORACLE中提供的图形界面上设置,具体数值可以根据用户的多少来设置