一、内存结构的概述
Oracle数据库为 程序代码、用户共享的数据 以及 每个连接用户的私有数据区域,创建和使用了多个内存区域。这些相关的基本内存结构包括System Global Area(SGA)、Program Global Area(PGA)、User Global Area(UGA)、Software Code Areas等。
在数据库实例启动时,首先在服务器内存中分配一个包含了实例数据和控制信息的共享内存区域(SGA),然后启动一组常驻内存的后台进程(执行维护任务,例如执行实例恢复、清理进程、编写重做缓冲区到磁盘等)。当客户端/应用程序连实例操作接数据库时,实例通过创建服务器进程(基于客户端请求执行工作,例如解析SQL查询并将放在共享池、创建和执行查询计划、从缓冲区缓存或磁盘中读取数据块),分配该进程专用的包含进程数据和控制信息的内存区域(PGA),来处理连接到该实例的客户端进程的请求。
二、SGA
即系统全局区域,是一组共享的内存结构,包含一个数据库实例的相关数据和控制信息,在实例启动时自动分配,在实例关闭时回收,包含一个数据库实例的相关数据和控制信息。所有的用户和服务器进程都共享。
SGA与后台进程一起构成一个数据库实例。服务器和后台进程是不驻留在SGA中的,而是存在于单独的内存空间。 SGA由多个内存组件组成,这些内存组件是用于满足特定类别的内存分配请求的内存池,其中包括Database Buffer Cache、Redo Log Buffer、In-Memory Column Store、Shared Pool、Large Pool、Java Pool、Streams Pool、Fixed SGA等。
SGA 中的数据字典缓存和其他信息会被实例的后台进程所访问,它们在实例启动后就固定在SGA中了,而且不会改变,所以这部分又称为固定SGA(Fixed SGA);Shared Pool、Java Pool、Large Pool和Streams Pool这几块内存区的大小是随系统参数设置而改变的,所以又通称为可变SGA(Variable SGA )。
SQL> show sga
Total System Global Area 4259229696 bytes --总系统全局区域大小
Fixed Size 2220072 bytes --固定SGA大小
Variable Size 1660948440 bytes --可变SGA大小
Database Buffers 2583691264 bytes --数据缓冲区缓存大小
Redo Buffers 12369920 bytes --重做日志缓冲区缓存大小
1、Database Buffer Cache
也叫Buffer Cache,即数据库缓冲区缓存或者缓冲区缓存,是存储从数据文件中读取的数据块的副本的内存区域。Oracle进程如果发现需要访问的数据块已经在Buffer Cache中,就可以直接读写在内存中的相应区域即相应的缓冲块,而无需读取数据文件以提高性能。
一个缓冲块(Buffer)的状态包括:Unused,不用的(从未被使用过或当前未被使用的块,是可供使用的块);Clean,干净的(较早被使用而现在包含了在一个时间点上是读一致版本的块,数据库可以定位并重用的块);Dirty,脏的(缓冲块中包含尚未写入磁盘的已修改数据。数据库必须在重新使用之前检查的块)
为了使缓冲区访问有效,必须确定要在内存中缓存哪些缓冲区以及从磁盘访问哪些缓冲区,数据库默认使用了基于LRU的替换算法,是通过两个重要的链表实现的:写链表和最近最少使用链表(the Least Recently Used,LRU)。写链表所指向的是所有脏数据块缓存(即被进程修改过,但还没有被回写到数据文件中去的数据块,此时缓冲中的数据和数据文件中的数据不一致)。而LRU链表指向的是所有空闲的缓存、正在被访问的缓存以及还没有来的及移入写链表的脏缓存。LRU列表有一个热端和冷端。冷端的缓冲区是最近没有使用的缓冲区