SGA(System Global Area)管理
SGA是一段共享内存区域,包含实例的数据和控制信息,多个用户可以通过这个内存区域共享数据,以避免反复、长时间的从物理磁盘访问数据。
SGA的组成:Database buffer cache存储在数据库中的数据被查询和修改前,必须将这部分数据从磁盘中读取到buffer cache中,所有用户进程共享访问这部分内存,通常,buffer cache要设置的足够大来避免频繁的磁盘I/O操作。
Shared pool共享池缓存的用户间的共享信息:反复调用的SQL 语句。
用户帐户数据、表、索引描述和权限等来自于数据字典的信息。
数据库中储存的过程这类可执行的代码。
Redo log buffer在redo信息可以被写回到物理的online redo log 文件之前,通过该buffer缓存这些信息来改善性能。
Large pool这个可选区域用于缓存各种服务进程中较大的I/O请求。
Java poolJava池用于JVM(Java Virtual Machine)中的Java代码和数据等特定会话。
Streams pool流池用于Oracle的流功能。
Result cache结果缓存缓存着查询的结果,如果一个查询执行的结果在该缓存中存在,数据库通过直接返回该结果来取代重新执行查询语句。这个组成部分用用于加速查询执行的频率。
通过下图展示SGA区的工作组成
通过连接实例查看SGA分配情况SQL> show sga;
Total System Global Area 6680915968 bytes
Fixed Size 2213936 bytes
Variable Size 2550138832 bytes
Database Buffers 4093640704 bytes
Redo Buffers 34922496 bytes
首先,分别解释SGA组成部分
Database Buffer Cache:
在9i之前该部分的大小主要由以下两个参数决定,db_block_buffers的值表示为分配给buffer cache的缓存块数量,db_block_size表示buffer cache的一个块的大小。SQL> show parameter db_block
NAME TYPE VALUE
---------------- ------------- ------------------------------
db_block_buffers integer 0
db_block_size integer 8192
因此,如果db_block_buffers的值不为0,那么Database buffer cache=db_block_buffers*db_block_size。Oracle后续引入一个新的初始化参数db_cache_size。该参数定义db_block_size的默认缓冲池的大小。
db_cache_size最小值为一个粒度(Granule)。粒度也是9i引入的一个概念,是连续虚拟内存的分配单位。其大小取决于SGA估计的总大小,SGA总大小由SGA_MAX_SIZE参数设定。
修改SGA_MAX_SIZE的大小(本实验时在11.2.0.1.0下进行测试的)SQL> alter system set sga_max_size=1G scope=spfile;
SQL> show parameter db_cache_size
NAME TYPE VALUE
------------------------ ----------- ------------------------------
db_cache_size big integer 24M
SQL> @getparDescr.sql
Enter value for get_parameters: _ksmg_granule_size
old 10: and ksppinm like '&get_parameters%'
new 10: and ksppinm like '_ksmg_granule_size%'
NAME TYPE VALUE VALUE DEFAULTS DESCRIBE KSPPIHASH
-------------------- ---------- --------------- --------------- --------- ------------------------------ ----------
_ksmg_granule_size 3 4194304 4194304 TRUE granule size in bytes 4165852122
从1G修改成2G可以看到粒度发生改变SQL> alter system set sga_max_size=2G scope=spfile;
SQL> @getparDescr.sql
Enter value for get_parameters: _ksmg_granule_size