关于SGA设置的一点总结
本总结不针对特例仅对服务器只存在OS + ORACLE 为例如果存在其他应用请酌情考虑
写这个也是因为近来这种重复性的问题发生的太多所导致的
首先不要迷信STSSGOCPEXPERT 等给出的任何建议内存百分比的说法
基本掌握的原则是 data buffer 通常可以尽可能的大shared_pool_size 要适度log_buffer 通常大到几百K到M就差不多了
设置之前首先要明确个问题
除去OS和一些其他开销能给ORACLE使用的内存有多大
oracle是bit or bitbit 通常 SGA有 G 的限制(某些OS的处理或者WINDOWS上有特定设定可以支持到G以上甚至达到G本人无这方面经验)
下面是我的windows下的oracle :
SQL> select * from v$version;
BANNER
Oraclei Enterprise Edition Release Production
PL/SQL Release Production
CORE Production
TNS for bit Windows: Version Production
NLSRTL Version Production
SQL>
windows上存在bit的限制如AIXHP UNIX 等有明确的BIT OS and ORACLE的版本bit oracle可以装在bit os 上 bit oracle不能装在 bit OS上
不管oracle是 bit ORACLE还是 bit 的假定应用存在没有很好的使用bind var 的情况也不能设置 shared_pool_size 过大通常应该控制在MM如果是 ORACLE ERP 一类的使用了很多存储过程函数包 或者很大的系统可以考虑增大shared_pool_size 但是如果超过M可能是危险的达到G可能会造成CPU的严重负担系统甚至瘫痪所以shared_pool_size 如果超过M还命中率不高那么应该从应用上找原因而不是一味的增加内存shared_pool_size 过大主要增加了管理负担和latch 的开销
log_buffer : K M 之间通常问题不大不应该太大
large_pool_size :如果不设置MTS通常在 RMAN OPQ 会使用到但是在M M 应该差不多了假如设置 MTS则由于 UGA 放到large_pool_size 的缘故这个时候依据 session最大数量和 sort_ares_size 等参数设置必须增大large_pool_size 的设置可以考虑为 session * (sort_area_size + M)这里要提醒一点不是必须使用MTS我们都不主张使用MTS尤其同时在线用户数小于的情况下
java_pool_size : 若不使用java给M通常就够了
data buffer 在做了前面的设置后凡可以提供给oracle的内存都应该给data buffer = (db_block_size * db_block_buffers)
在i 中可以是 db_cache_size
还有个重要参数我们需要注意
sort_area_size and hash_area_size
这两个参数在非MTS下都是属于PGA 不属于SGA是为每个session单独分配的在我们的服务器上除了OS + SGA一定要考虑这两部分
(****) : OS 使用内存+ SGA + session*(sort_area_size + hash_area_size + M) < 总物理RAM 为好
这样归结过来假定oracle是 bit 服务器RAM大于G 注意你的PGA的情况则建议
shared_pool_size + data buffer +large_pool_size + java_pool_size < G
再具体化注意满足上面(****) 的原则的基础上可以参考如下设置
如果M RAM
建议 shared_pool_size = M data buffer = M
如果G RAM
shared_pool_size = M data buffer = M
如果G
shared_pool_size = M data buffer = G
物理内存再大已经跟参数没有关系了
假定 bit ORACLE
内存G
shared_pool_size = M data buffer = G
内存G
shared_pool_size = M data buffer = G
内存 G
shared_pool_size = MM data buffer = G
以上仅为参考值不同系统可能差异比较大需要根据具体情况调整建议在设置参数的同时init中使用 lock_sga 在不同的平台上可能有不同的方式使得SGA锁定在物理内存中而不被放入 SWAP 中这样对效率有好处
关于内存的设置要再进行细致的调整起的作用不大但可根据statspack信息和v$system_eventv$sysstatv$sesstatv$latch 等view信息来考虑微调