关于SGA设置的一点总结
1.测试环境:HP 服务器,4GB内存,32位Windows 2003企业版
2.修改c:\boot.ini文件,添加/PAE选项后如下:

[boot loader]
timeout=30
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Windows Server 2003, Enterprise" /noexecute=optout /fastdetect /PAE
[code]
3.重新启动Windows后,修改Oracle SGA参数,重启Oracle即可生效:
[code]
alter system reset sga_max_size scope=spfile sid='*';
alter system reset sga_target scope=spfile sid='*';
alter system set shared_pool_size=256M scope=spfile;
alter system set db_block_buffers=320000 scope=spfile;
alter system set use_indirect_data_buffers=true scope=spfile;
shutdown immediate;
startup;

使用PAE模式后,无法再使用Oracle自动内存管理功能,因此需要将sga_max_size和sga_target参数去掉,改用手动管理各内存组件,如上面的shared_pool_size参数和db_block_buffers参数分别指定的是共享池和数据缓冲区的大小,use_indirect_data_buffers指定oracle可以使用超过32位平台限制4GB以上的内存段
4.通过查看Oracle sga统计信息可以看到设置已生效:

SQL> select pool,sum(bytes)/1024/1024 from v$sgastat group by pool;
 
POOL         SUM(BYTES)/1024/1024
------------ --------------------
                      2507.99859 ---db buffer cache
java pool                      24
shared pool             256.00449 ---shared pool
 
由于工作需要,单位的服务器进行升级,使用至强CPU,内存为8GB,系统为windows2003,数据库为oracle8i,在32位系统中使oracle使用超过4G内存的问题,
  1、由于32位系统内存寻址只能到4G,所以在32位系统上使用超过4G的内存,首先要使用支持大内存的软硬件,比如使用至强的CPU(虽然是32位CPU,但是上增加了扩展寻址的能力),windows2003企业版或数据中心版。
  2、在操作系统中启用PAE(Physical Address Extensions )功能,这样oracle便可以通过windows的AWE(Address Windowing Extensions)API使用多余4G的内存。
  方法:打开系统根目录下的隐藏文件 Boot.ini ,添加 PAE 开关:
  (1)multi(0)disk(0)rdisk(0)partition(2)\%systemroot%="Windows Server 2003, Datacenter Edition" /PAE
  (2)multi(0)disk(0)rdisk(0)partition(2)\%systemroot%="Windows Server 2003, Datacenter Edition" /3GB /PAE
  我们知道32位windows对于每个进程都分配4GB内存(虚拟内存),其中起始的2GB归windows核心使用,考试@大提示剩余的归应用程序本身使用。因此这两种方法的区别就在于:
  方法一只使用了/PAE开关表示启用/PAE功能但是系统对每个进程仍然采用2G核心、2G应用程序的内存分配方式。
  方法二除了/PAE开关还使用了/3GB开关表示不仅启用/PAE功能并且系统对每个进程采用1G核心、3G应用程序的内存分配方式。不过这种方式不支持大于16GB的内存,也就是说如果你的实际内存超过16GB则只能使用方法一,这是因为大于16GB后1G的核心内存已经不够windows实现PAE功能。
  3、给运行Oracle数据库的操作系统帐户,授予"Lock Pages in Memory"的系统权限。
  执行 gpedit.msc打开“组策略”控制台
  “计算机配置”->“Windows 设置”->“安全设置”->“本地策略”->“用户权利指派”
  双击右边“锁定内存中的页”(或名为"内存中锁定页"),在“本地安全策略设置”对话框中,单击“添加”按钮,在“选择用户或组”对话框中,添加有权运行 oracle的帐户。
  4、配置oracle数据库的参数文件(init*.ora),添加USE_INDIRECT_DATA_BUFFERS=TRUE参数,表示使用扩展的内存。
  5、修改注册表中的AWE_WINDOW_MEMORY键值为合适值。该值表示在3GB内存中(如果使用了/3GB开关,如果没有使用该开关则为2GB)有多少用于数据库块缓存。
  注意:
  (1)该值位置在HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME0为二进制类型,单位为bytes。
  (2)如果不存在表示使用默认值1GB。
  (3)该值太大或太小都有可能导致数据库无法启动。
  这里解释一下:尽管我们现在拥有超过4GB的内存,但是这些多余的内存并不是oracle可以随便使用的,这些内存只能用于数据库块缓存(即db_buffer),而像share Pool,log buffer等只能保存在应用程序可访问的3GB内存中(如果使用了/3GB开关,如果没有使用该开关则为2GB)。在这里我将4GB以外内存中的数据库块缓存叫做AWE数据块缓存(自己起的名字:-))。这里又有问题了,oracle缓冲的数据块并不能全部保存到4GB以外的内存中,还必须在应用程序可直接访问的3GB内存(如果使用了/3GB开关,如果没有使用该开关则为2GB)中使用一部分空间来保存,这一部分内存我称为直接数据块缓存(自己起的名字:-))。也就是说“数据块缓存=AWE数据块缓存+直接数据块缓存”,为什么会这样呢,因为oracle缓冲到内存中的每个数据块的头部必须保存到“直接数据块缓存”中,是不能够保存到“AWE数据块缓存”中的,并且每个数据块的大小(db_block_size)和数据块的多少(db_block_buffers)都会影响到头部占用空间的多少。并且访问“直接数据块缓存”要比“AWE数据块缓存” 快, 因此AWE_WINDOW_MEMORY一般来讲需要设置的尽量大(但不能无限大,比如必须小于3GB),oracle建议以默认值为基础,以20%递增扩大,进行测试。比如先测试1GB大小,在测试1.2GB大小等等。
  一般来讲AWE_WINDOW_MEMORY有一个最小公式
  min(AWE_WINDOW_MEMORY)=(4096 * db_block_size * db_block_lru_latches)/8
  其中:
  max buffer pools是一个常量=8
  sets_per_tool=2*cpu_count (use_indirect_data_buffers=true)
  sets_per_tool=cpu_count/2 (use_indirect_data_buffers<>true)
!!!!win2003 企业+sp2 默认就支持4G了
本总结不针对特例,仅对服务器只存在OS + ORACLE 为例,如果存在其他应用请酌情考虑
写这个也是因为近来这种重复性的问题发生的太多所导致的
首先不要迷信STS,SG,OCP,EXPERT 等给出的任何建议、内存百分比的说法
基本掌握的原则是, data  buffer 通常可以尽可能的大,shared_pool_size 要适度,log_buffer 通常大到几百K到1M就差不多了
设置之前,首先要明确2个问题
1: 除去OS和一些其他开销,能给ORACLE使用的内存有多大
2:oracle是64bit  or  32 bit,32bit 通常 SGA有 1.7G 的限制(某些OS的处理或者WINDOWS上有特定设定可以支持到2G以上甚至达到3.7G,本人无这方面经验)
下面是我的windows2000下的oracle :
SQL> select * from v$version;
BANNER
----------------------------------------------------------------
Oracle8i Enterprise Edition Release 8.1.7.0.0 - Production
PL/SQL Release 8.1.7.0.0 - Production
CORE    8.1.7.0.0       Production
TNS for 32-bit Windows: Version 8.1.7.0.0 - Production
NLSRTL Version 3.4.1.0.0 - Production
SQL>
windows上存在32bit的限制,如AIX、HP UNIX 等有明确的64BIT OS and ORACLE的版本,32bit oracle可以装在64bit os 上,64  bit oracle不能装在32 bit  OS上
不管oracle是32 bit ORACLE还是 64  bit 的,假定应用存在没有很好的使用bind  var 的情况,也不能设置 shared_pool_size 过大,通常应该控制在200M--300M,如果是 ORACLE ERP 一类的使用了很多存储过程函数、包 ,或者很大的系统,可以考虑增大shared_pool_size ,但是如果超过500M可能是危险的,达到1G可能会造成CPU的严重负担,系统甚至瘫痪。所以shared_pool_size 如果超过300M还命中率不高,那么应该从应用上找原因而不是一味的增加内存,shared_pool_size 过大主要增加了管理负担和latch 的开销。
log_buffer :  128K ----  1M 之间通常问题不大,不应该太大
large_pool_size :如果不设置MTS,通常在 RMAN 、OPQ 会使用到,但是在10M ---  50M 应该差不多了。假如设置 MTS,则由于 UGA 放到large_pool_size 的缘故,这个时候依据 session最大数量和 sort_ares_size 等参数设置,必须增大large_pool_size 的设置,可以考虑为  session *  (sort_area_size + 2M)。这里要提醒一点,不是必须使用MTS,我们都不主张使用MTS,尤其同时在线用户数小于500的情况下。
java_pool_size : 若不使用java,给30M通常就够了
data  buffer ,在做了前面的设置后,凡可以提供给oracle的内存,都应该给data buffer = (db_block_size * db_block_buffers)
在9i 中可以是 db_cache_size
还有2个重要参数我们需要注意
sort_area_size and  hash_area_size
这两个参数在非MTS下都是属于PGA ,不属于SGA,是为每个session单独分配的,在我们的服务器上除了OS + SGA,一定要考虑这两部分
(****)  : OS 使用内存+  SGA + session*(sort_area_size + hash_area_size + 2M) < 总物理RAM  为好

这样归结过来,假定oracle是 32 bit ,服务器RAM大于2G ,注意你的PGA的情况,,则建议
shared_pool_size + data buffer +large_pool_size + java_pool_size < 1.6G

再具体化,注意满足上面(****) 的原则的基础上可以参考如下设置
如果512M RAM
建议 shared_pool_size = 50M, data buffer = 200M
如果1G RAM 
shared_pool_size = 100M , data  buffer = 500M
如果2G
shared_pool_size = 150M ,data  buffer = 1.2G
物理内存再大已经跟参数没有关系了

假定64  bit  ORACLE
内存4G
shared_pool_size =  200M , data  buffer = 2.5G
内存8G
shared_pool_size = 300M , data  buffer = 5G
内存 12G
shared_pool_size = 300M-----800M , data  buffer = 8G
 
以上仅为参考值,不同系统可能差异比较大,需要根据具体情况调整。建议在设置参数的同时,init中使用 lock_sga ,在不同的平台上可能有不同的方式,使得SGA锁定在物理内存中而不被放入 SWAP 中,这样对效率有好处

关于内存的设置,要再进行细致的调整,起的作用不大,但可根据statspack信息和v$system_event,v$sysstat,v$sesstat,v$latch  等view信息来考虑微调