Oracle的内存是与实例对应的,一个实例就有一个独立的内存结构,Oracle的内存中主要存储以下信息:
1,oracle的程序代码以及程序执行所需的信息
2,数据缓存
3,会话信息以及进程间通信的信息(如锁)
Oracle的基本内存结构包括:
Sga(system global area),此区域由所有的服务进程和后台进程共享
Pga(program global area),此区域是每个服务进程和后台进程所似有,即每个进程都有一个属于自己的pga
可以用下表示意:
SGA
| ||
Share pool | Buffer cache | Redo log buffer |
Java pool | Stream pool(10g) | Large pool |
Fixed SGA | Keep buffer cache | User define buffer |
PGA(*n)
| ||
Bitmap merge area | Sort area | Hash area |
|
Sga包含
数据缓存区(database buffer cache)
重做日志缓冲区(redo log buffer)
共享池(shared pool)
Java池(java pool)
大池(large pool)
数据流池(streams pool)
数据字典缓存区(data dictionary cache)
其他信息(如数据库和实例的状态信息)
当实例启动时系统即分配sga。例如:
SQL> startup nomount;
ORACLE instance started.
Total System Global Area 591396864 bytes
Fixed Size 1268800 bytes
Variable Size 322962368 bytes
Database Buffers 260046848 bytes
Redo Buffers 7118848 bytes
SQL>
可以通过一些参数来设置sga,这些参数影响系统的整体性能。
SGA_MAX_SIZE和SGA_TARGET
SQL> show parameters SGA
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
lock_sga boolean FALSE
pre_page_sga boolean FALSE
sga_max_size big integer 564M
sga_target big integer 564M
SQL>
也可以通过v$sga系统视图来查看对应的值:
SQL> select * from v$sga;
NAME VALUE
-------------------- ----------
Fixed Size 1268800
Variable Size 322962368
Database Buffers 260046848
Redo Buffers 7118848
在前面的sga相关参数中还有两个分别是lock_sga和pre_page_sga,pre_page_sga默认设置为false,实例启动时不必将sga全部分配物理内存,设置为true则是全部分配,当lock_sga设置为true时,锁定sga在物理内存中,不允许换入和换出。
SGA_TARGET
当设置了SGA_TARGET参数时,数据库自动启动了ASMM(自动内存管理),oracle将代替人工来控制sga中的buffer pool,shared pool等区域的大小,随时调节以将系统性能最大化和最合理化。Sga_target的值总是小于或等于sga_max_size。不能指定大于sga_max_size的sga_target,例如:
SQL> alter system set sga_target=600M;
alter system set sga_target=600M
*
ERROR at line 1:
ORA-02097: parameter cannot be modified because specified value is invalid
ORA-00823: Specified value of sga_target greater than sga_max_size
当指定SGA_TARGET小于SGA_MAX_SIZE,实例重启后,SGA_MAX_SIZE就自动变为和SGA_TARGET一样的值了。但可以将sga_max_size设置的稍大,在启动实例的时候可以动态的设置sga_target的值:
SQL> alter system set sga_target=500M;
System altered.
SQL> show parameters SGA;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
lock_sga boolean FALSE
pre_page_sga boolean FALSE
sga_max_size big integer 564M
sga_target big integer 500M
SQL> alter system set sga_target=564M;
System altered.
SQL>
如果sga_target=0则sga的容量由多个初始化参数决定,主要有:
DB_CACHE_SIZE 标准容量数据块使用的缓存区的容量
LOG_BUFFER 重做日志缓冲区的容量,以字节为单位
SHARED_POOL_SIZE 存储共享SQL及PLSQL的内存容量,以字节为单位
LARGE_POOL_SIZE 大池容量,默认为0
JAVA_POOL_SIZE java池的容量
DB_nK_CACHE_SIZE 非标准容量数据块使用的缓存区
DB_KEEP_CACHE_SIZE 保留缓存区
DB_RECYCLE_CACHE_SIZE 回收缓存区
这些参数可以使用alter system来调整
可以通过v$sgastat视图来查看sga的相关统计信息,这个视图记录了各个池的内存分配情况,例如:
SQL> desc v$sgastat;
Name Null? Type
----------------------------------------- -------- ----------------------------
POOL VARCHAR2(12)
NAME VARCHAR2(26)
BYTES NUMBER
SQL> select pool,sum(bytes) from v$sgastat group by grouping sets (pool,());
POOL SUM(BYTES)
------------ ----------
java pool 4194304
large pool 4194304
shared pool 314577492
268434496
591400596
SQL> select * from v$sgastat where rownum <10;
POOL NAME BYTES
------------ -------------------------- ----------
fixed_sga 1268800
buffer_cache 260046848
log_buffer 7118848
shared pool KGX 105012
shared pool call 22048
shared pool list 3584
shared pool dummy 9468
shared pool kfmsg 3088
shared pool kksss 3072
9 rows selected.
视图V$SGA_DYNAMIC_FREE_MEMORY记录当前sga可用于动态调整sga内存区的空闲区域大小。由于设置的sga_target=0,因此值为0:
SQL> select * from V$SGA_DYNAMIC_FREE_MEMORY a;
CURRENT_SIZE
------------
0
SQL>
数据库缓冲
10g使用db_cache_size来设置buffer cache的大小
当oracle用户进程第一次访问一个数据块时,会先查找buffer cache中是否存在这个数据块的拷贝,如果已经存在(命中),他就直接从内存中读取数据块,如果未命中,则需要先从数据文件中读取该数据块到buffer cache中,然后再访问该数据块。
通常可以用下列代码来查看实例启动到目前为止的命中率情况:
SQL> select 1 - (sum(decode(name, 'physical reads', value, 0)) /
2 (sum(decode(name, 'db block gets', value, 0)) +
3 (sum(decode(name, 'consistent gets', value, 0))))) "Buffer Hit Ratio"
4 from v$sysstat;
Buffer Hit Ratio
----------------
.932341968
SQL>
Oracle 对于 buffer cache 的管理是通过两个重要的链表实现的:写链表和最近最少使用链表 (the least recently used LRU) 。来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/16179598/viewspace-665999/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/16179598/viewspace-665999/