Oracle 内存结构
Oracle的3个主要的内存结构:
-
系统全局区 (System Global Area, SGA):这是一个很大的共享内存段,几乎所有的Oracle进程都要访问这个区 域
-
进程全局区 (Porcess Global Area, PGA):这是一个进程或线程专有的内存,其他的进程/线程不能访问。
-
用户全局区 (User Global Area, UGA):这个区域与特定的会话相关联。它可能在SGA中分配,也可能在PGA中分配,取决于是用专用服务器还是共享服务器来连接数据库。如果使用专用服务器,UGA在PGA中分配,如果使用共享服务器,UGA在SGA中分配。
PGA是特定于进程的一段内存。这是一个操作系统或线程专用的内存,不允许系统中的其他线程或进程访问。PGA绝对不会在Oracle的SGA中分配,而总是在进程或线程在本地分配。
UGA就是你的会话状态。会话总能访问这部分内存。
SGA是一组共享的内存结构,被所有服务器进程和后台进程使用,所以也叫全局共享区。
它由以下部分构成:数据库高速缓冲区、日志缓冲区、共享池、JAVA池、大池和流池。它的最大尺寸由SGA_MAX_SIZE控制。
数据高速缓冲区(Database Buffer Cache):用于存放从数据文件读取的数据块,由初始化参数db_catch_size决定。buffer cache可以分成Default 、Keep和Recycle三个部分。Keep池存放持久存放的数据,Recycle池存放经常一次性使用的数据,而Default池一般用于当数据不指定存在在前2者的时候的存放地,一般我们的表都是存放于Default池的。除非你在建表的时候指定 Store(buffer_pool keep) or Store(buffer_pool recycle)。他们的大小由db_keep_cache_size 和db_recycle_cache_size参数指定。
在管理buffer cache的时候,一般使用2个列表--LRU LIST 和 Dirty LIST (write list 或者CheckPoint Queue)。各种List上面存放的是指向实际buffer的指针。一般读取的数据时存放在 LRU list上的,修改过后的数据被标识为Dirty,被转移到Dirty List上,并且会被DBWR写到数据文件中。
模拟下oracle进程使用高速缓冲区的过程:一个sql语句发过来,首先在高速缓冲区的LRU LIST面寻找有没要的数据,如果找到了,直接返回;反之,就需要把数据从数据文件写入到高速缓冲区中的LRU LIST。首先在LRU里面寻找有没free buffer的空间,如果有,直接把数据从数据文件写入到高速缓冲区的LRU LIST 指定的buffer里面,同时它还会将扫描到的修改过的buffer移动到Dirty List里面。如果扫描LRU超过一个阈值,一般为40%还没找到足够的free buffer,就要通知DBWR把dirty list里面指向的buffer写到数据文件里面,腾出空间给LRU LIST,然后把数据填到刚新增的free buffers里。 这里可以看出,如果你的高速缓冲区很小的,不停地写写,造成很大I/O开销。
日志缓冲区(Redo Log Buffer): 用于存放日志条目,日志条目就是记录对数据的改变。当这块区域用光时,后台进程LGWR把日志条目写到磁盘上的联机日志文件中。它由初始化参数log_buffer决定大小。同样的道理下,日志缓冲区应该稍微大点,特别是有长时间运行的事务的时候,可以大量减少I/O。
共享池(Shared Pool):用于存放SQL语句、PL/SQL代码、数据字典、资源锁和其他控制信息。它由初始化参数SHARED_POOL_SIZE控制其大小。
它包含以下几个缓冲区:
库缓冲区(Library Cache):存放解析并且执行过的SQL和PL/SQL代码。可以用于共享解析树和执行计划,加快语句执行速度。共享SQL区:存放SQL语句的解析树和执行计划;私有SQL区:这部分存放的东西只被会话私有,一般包含一些变量,会话参数等。数据字典缓冲区(Data Dictionary Cache):存放一些被频繁访问的数据字典信息,防止过多对系统表空间进行访问。以行的形式存放数据,所以又叫行存储区。
大池(Large Pool):一般用于数据库的备份和恢复、并行查询、共享服务器模式下的会话内存。不建立大池,所需要的内容要从共享池或者PGA内获取。它由初始化参数large_pool_size控制.
JAVA池(JAVA Pool):用于支持在数据库中运行java代码,一般由java_pool_size控制。
流池(Stream Pool):加强对流的支持,一般由stream_pool_size控制。
查询SGA区的情况:
1.show SGA
2.select * from v$sga
NAME VALUE
-------------------- ----------
Fixed Size 1249488
Variable Size 159387440
Database Buffers 281018368
Redo Buffers 7135232
这里的Fixed Size表示固定区域,存储SGA各个组件的信息。不能修改大小。
Variable Size表示可变区域,比如共享池、java池、大池等。‘
Database Buffers表示数据库高速缓冲区。
Redo Buffers表示日志缓冲区。