在sqlplus下执行show sga可以看到oracle sga对内存的使用情况:
SQL> show sga
Total System Global Area 186089336 bytes
Fixed Size 741240 bytes
Variable Size 150994944 bytes
Database Buffers 33554432 bytes
Redo Buffers 798720 bytes
这里有些预备知识:
The fixed area:
SGA中的The fixed area包含了数千个原子变量,以及如latches和指向SGA中其它区域的pointers(指针)等小的数据结构.通过对fixed table内表X$KSMFSV查询(如下)可以获得这些变量的名字,变量类型,大小和在内存中的地址.
The variable area:
SGA中的the variable area是由large pool、java pool和shared pool组成的.large pool的内存大小是动态分配的,而shared pool的内存大小即包含了动态管理的内存又包含了永久性的(已经分配的)内存.实际上,初始化参数shared_pool_size的大小设置是指定shared pool中动态分配的那部分内存的一个大概的SIZES而不是整个shared pool的SIZES
The database Buffers:
这个区域是数据库块的拷贝.在Oracle 8i中,buffer数由DB_BLOCK_BUFFERS指定.每个buffer的大小由DB_BLOCK_SIZE指定.所以这个区域的大小是两者相乘.在Oracle 9i中,这个区域的大小是DB_CACHE_SIZE指定.这个区不包含它们自己的控制结构,只包含database block copies data.每个buffer的header信息存在于SGA的the variable area中.还有latches信息也放在SGA的the variable area中.在设置DB_BLOCK_BUFFERS时每4个BUFFERS会影响the variable area的1K的SIZE.
The log buffer:
这个区域的SIZE是由参数LOG_BUFFER指定的.如果OS支持内存保护,log buffer将会被两个保护页面包围起来以免被一些ORACLE的错误进程损坏log buffer.在SGA中,跟其它的如variable area和database block area相比,log buffer是非常小的.log buffer分成内部的buffer blocks,而这些block各有8个字节的头部信息存在于variable area中.
在看从客户处采集的统计数据时,发现Variable Size与初始化参数中的定义不一致。原来9i下show sga的输出,不能如实地反映oracle对shared-pool等的消耗情况,而是反映了可变区域的最大值。9i下增加一个sga_max_size控制sga的总量,show sga输出中的Variable Size只是总量与sga其他项目之间的差值。
个人觉得select sum(bytes) from v$sgastat;的输出反映出来的sga消耗量比较真实。