
本篇主要介绍三大块内存结构。还有其他内存结构本篇就不在过多介绍。
环境介绍:OS:OEL 5 ORACLE版本:11.2.0.3
1、Shared pool 共享池
共享池的主要组件是库缓存,字典缓存,以及服务器结果缓存(取决于您的配置)。库缓存存储了最近引用的SQL和PL SQL代码的可执行文件(已解析或已编译)形式。字典高速缓存存储从数据字典引用的数据。服务器结果缓存存储查询结果和PL SQL函数结果。共享池中的许多缓存会根据需要自动增加或减少大小,包括库缓存和字典缓存。当共享池没有可用空间时,旧条目将被老化以容纳新条目。数据字典高速缓存或库高速缓存上的高速缓存未命中比缓冲区高速缓存上的未命中更为昂贵。因此,应调整共享池的大小,以确保缓存常用数据。共享池中有几种功能可以分配大量内存:例如,共享服务器,并行查询或Recovery Manager。Oracle建议通过配置不同的内存区域(称为大池)来隔离这些功能使用的SGA内存。共享池中的内存分配是按块执行的。这种分块使大型对象(超过5 KB)可以加载到缓存中,而无需单个连续区域。这样,数据库减少了由于碎片而耗尽足够的连续内存的可能性。通常,Java,PL SQL或SQL游标可能会在共享池之外进行大于5 KB的分配。为了使这些分配最有效地进行,Oracle数据库会隔离少量共享池。如果共享池没有足够的空间,则使用此内存。共享池的隔离区域称为保留池。
Library cache 库缓存区
库缓存包含SQL游标,PL SQL程序和Java类的可执行形式。本节重点介绍与游标,PL SQL程序和Java类相关的调优。这些统称为应用程序代码。运行应用程序代码时,如果以前已执行过并且可以共享,则Oracle数据库会尝试重用现有代码。如果该语句的已解析表示形式确实存在于库高速缓存中并且可以共享,则数据库将重用现有代码。这称为软解析或库高速缓存命中。如果Oracle数据库无法使用现有代码,则数据库必须构建该应用程序代码的新的可执行版本。这称为硬解析或库高速缓存未命中。处理SQL语句时,解析步骤或执行步骤上都可能发生库高速缓存未命中。当应用程序对SQL语句进行解析调用时,如果该语句的解析表示形式在库缓存中不存在,则Oracle数据库将解析该语句并将解析后的表单存储在共享池中。这是一个很难的解析。通过确保尽可能将所有可共享的SQL语句都放在共享池中,您可能能够减少解析调用时库缓存丢失的情况。为了执行硬解析,与软解析相比,Oracle数据库使用更多的资源。用于软解析的资源包括CPU和库缓存闩锁获取。硬解析所需的资源包括额外的CPU,库缓存闩锁获取和共享池闩锁获取。如果应用程序对SQL语句进行了执行调用,并且先前构建的SQL语句的可执行部分已经从库缓存释放,以便为另一个语句腾出空间,则Oracle数据库将隐式重新解析该语句。执行语句,为其创建一个新的共享SQL区域并执行它。这也会导致硬解析。通常,可以通过为库缓存分配更多的内存来减少执行调用时库缓存未命中的情况。
Data dictionary cache 数据字典缓冲区
数据字典缓存中存储的信息包括用户名,段信息,配置文件数据,表空间信息和序列号。字典缓存还存储有关架构对象的描述性信息或元数据。在解析SQL游标时或在PL / SQL程序的编译过程中,Oracle数据库使用此元数据。
2、Database buffer cache 数据库高速缓冲区
Database Buffer Cache 存放从数据文件中读取出来的数据块,也缓冲系统正在使用或者最近使用完的数据块。所有连接到数据库的用户,都可以共享该内存区域。并缓存应用修改后的脏块,并在脏块生成前产生 redo 日志,之后 commit,数据库将 redo 写入磁盘,但不会立即将脏数据块写入磁盘。通过检查点进程(CKPT)来协调,这样可以提高物理 I/O 的写入效率。将频繁访问的块保留在缓冲区缓存中,并将不常访问的块写入磁盘
3、redo log buffer 重做日志缓冲区
日志中记录数据块的地址,更改的时间以及对数据块做了哪些改变。
Oracle在执行任何DML和DDL操作改变数据之前,都会将恢复所需要的信息,先写入redo log buffer,然后再写入database buffer cache。
① 如果数据和回滚数据不在database buffer cache中,server process会将它们从dbf文件中读取到database buffer cache中。
② server process会在要修改的数据行上添加行级锁。
③ server process将数据的变化信息和回滚所需的信息都写入redo log buffer。
④ server process将对数据所做的修改后的数据信息写入database buffer cache,然后将database buffer cache中的这些数据标记为脏数据(此时内存中的数据和磁盘上的数据是不一致的)。
⑤ LGWR将重做日志缓冲区中的数据写入重做日志文件中。
⑥ DBWn将database buffer cache的脏数据写入数据文件中。




