Oracle show sga产生的结果研究


用show sga可以查看SGA的大小show sga的结果都有如下的格式:

Total System Global Area AAAAA bytes

Fixed Size BBBBB bytes

Variable Size CCCCC bytes

Database Buffers DDDDD bytes

Redo Buffers EEEEE bytes

里给出一台测试上Oracle实例的sga信息:

Total System Global Area  369098752 bytes
Fixed Size                  1219496 bytes
Variable Size             171967576 bytes
Database Buffers          188743680 bytes
Redo Buffers                7168000 bytes

其中各部分的含义如下:

Fixed Size: 这部分是Oracle内部使用的一个区,Oracle通过这个区找到SGA其他区,类似一个SGA各个组件的索引,不同平台和不同版本下这部分的大小可能不一样。

Variable Size: 包括 shared pool ,java pool ,large pool, 管理db_block_buffers 的内存、管理控制文件信息的内存等等其他管理和控制Oracle 内部结构的内存[这部分通常被称为Overhead],也就有了如下的公式:

Variable Component(Show SGA) = Shared Pool + Large Pool + Java Pool + Overhead + Free Memory(9i 之前的版本)

Overhead的大小受如下初始化参数的影响:db_files, open_cursors ,processes ,具体算法未知。

Database Buffers: 为db_cache_size、db_keep_cache_size、db_recycle_cache_size、 db_nk_cache_size的总大小,当然这是sga_target为0的情况,也就是手动SGA管理模式下,如果是自动SGA管理(sga_target>0),则这个值根据sga的分配情况自动进行调整。

Redo Buffers:这部分是实际分配的Redo log buffer的大小,由初始化参数log_buffer根据SGA的最小分配单位granule 向上取整得到。

这里给出一个测试数据库实例的log_buffer参数大小:

SQL> show parameter log_buffer;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
log_buffer                           integer     7057408

实际的Redo log buffer大小也可以通过v$sgastat视图查看,和show sga命令是同样的结果:

SQL> select * from v$sgastat where name='log_buffer';

POOL         NAME                            BYTES
------------ -------------------------- ----------
 log_buffer                    7168000

因为这里sga为352MB<1G,所以granule为4MB,也可以通过以下命令查询获得:

SQL> select * from v$sgainfo where name = 'Granule Size';

NAME                                  BYTES RES
-------------------------------- ---------- ---
Granule Size                        4194304 No

缺省的SGA中的Fixed Size将和log_buffer共享整数倍的granule:

SQL> select (1219496 +7168000)/4194304 from dual;

(1219496+7168000)/4194304
-------------------------
1.99973488

因为精确度也只到字节,所以比值也有可能有误差。

相关内容