Oracle内存结构详解
立即解锁
发布时间: 2025-08-23 01:22:10 阅读量: 3 订阅数: 20 

# Oracle内存结构详解
## 1. 固定SGA(Fixed SGA)
固定SGA是SGA的一个组成部分,其大小因平台和版本而异。在安装时,它被“编译”到Oracle二进制文件中(因此称为“固定”)。固定SGA包含一组指向SGA其他组件的变量,以及包含各种参数值的变量。其大小我们无法控制,通常非常小,可以将其视为SGA的“引导”部分,Oracle内部使用它来查找SGA的其他部分。
## 2. 重做缓冲区(Redo Buffer)
### 2.1 作用
重做缓冲区是在将需要写入联机重做日志的数据写入磁盘之前临时缓存的地方。由于内存到内存的传输比内存到磁盘的传输快得多,使用重做日志缓冲区可以加速数据库操作。数据不会在重做缓冲区中停留很长时间。
### 2.2 刷新情况
LGWR会在以下情况下将该区域刷新到磁盘:
- 每三秒
- 发出COMMIT或ROLLBACK时
- 要求LGWR切换日志文件时
- 重做缓冲区达到三分之一满或包含1MB的缓存重做日志数据时
### 2.3 大小设置建议
- Oracle建议将重做日志缓冲区大小至少设置为8MB。
- 如果使用闪回功能且SGA大于4G,建议将日志缓冲区设置为至少64MB。
- 如果使用异步重做传输的Data Guard且重做生成率较高,建议将其设置为至少256MB。
### 2.4 大系统中的优势
对于有大量并发事务的大型系统,较大的重做日志缓冲区可能会有一定好处。因为当LGWR(负责将重做日志缓冲区刷新到磁盘的进程)写入部分日志缓冲区时,其他会话可以继续填充它。一般来说,生成大量重做的长时间运行的事务从比正常更大的日志缓冲区中受益最大,因为在LGWR忙于写出部分数据时,它会不断填充重做日志缓冲区的一部分。
### 2.5 默认大小
重做缓冲区的默认大小由LOG_BUFFER参数控制,因操作系统、数据库版本和其他参数设置而异。可以通过以下查询查看默认大小:
```sql
SQL> select value, isdefault from v$parameter where name = 'log_buffer';
VALUE ISDEFAULT
-------------------- ---------
7036928 TRUE
```
这里的大小约为7MB。默认日志缓冲区的最小大小取决于操作系统。若想了解最小大小,可将LOG_BUFFER设置为1字节并重启数据库,例如在Oracle Linux实例上:
```sql
SQL> alter system set log_buffer=1 scope=spfile;
SQL> startup force;
SQL> show parameter log_buffer
NAME TYPE VALUE
------------------------------------ ----------- --------------------------
log_buffer integer 1680K
```
在该系统上,无论如何设置,最小日志缓冲区为1.680MB。
### 2.6 注意事项
对于大多数数据库应用程序,LOG_BUFFER参数的默认值就足够了。如果看到与日志缓冲区空间事件相关的大量等待,则考虑增加LOG_BUFFER参数。
## 3. 数据库块缓冲区缓存(Database Block Buffer Cache)
### 3.1 重要性
数据库块缓冲区缓存是Oracle在将数据库块写入磁盘之前和从磁盘读取之后存储它们的地方。这是SGA中至关重要的区域,若设置过小,查询将运行得非常慢;若设置过大,会导致其他进程资源不足。
### 3.2 缓存池
在SGA中有三个地方可以存储来自各个段的缓存块:
- **默认池(Default pool)**:所有段块通常缓存的位置,是最初且曾经唯一的缓冲区池。
- **保留池(Keep pool)**:按惯例,将访问频率较高,但由于其他段需要空间而从默认缓冲区池中淘汰的段分配到这里。
- **回收池(Recycle pool)**:按惯例,将随机访问且会导致许多段的大量块过度刷新的大段分配到这里。缓存这些段没有好处,因为当你再次需要该块时,它可能已经从缓存中淘汰。将这些段与默认池和保留池中的段分开,可避免它们导致其他块从缓存中淘汰。
### 3.3 池的管理
这三个池管理块的方式大致相同,没有针对块老化或缓存的根本不同算法。其目的是让DBA能够将段隔离到热、温以及“无需缓存”的区域。默认池中的对象热度足够高,会一直留在缓存中;而一些较受欢迎但不是很热的段的块可能会被刷新,为不常用的块腾出空间。为了缓存这些温段的块,可以采取以下两种方法之一:
- 将这些段分配到保留池,试图让温块在缓冲区缓存中停留更长时间。
- 将“无需缓存”的段分配到回收池,保持回收池较小,以便块能快速进出缓存(减少管理它们的开销)。
### 3.4 其他可选缓存
除了默认、保留和回收池外,还有多达四个可选缓存DB_nK_CACHE_SIZE,用于支持数据库中的多种块大小。数据库可以有一个默认块大小(即创建数据库时使用的块大小,用于SYSTEM和所有临时表空间),以及多达四个非默认块大小。这些缓冲区缓存中的块管理方式与原始默认池中的块相同,没有特殊的算法更改。
## 4. 缓冲区缓存中块的管理
### 4.1 管理方式
为简单起见,假设只有一个默认池,因为其他池的管理方式相同。缓冲区缓存中的块基本上在一个地方管理,有两个不同的列表指向它们:
- 数据库块写入器(DBWn)需要写入的脏块列表
- 非脏块列表
### 4.2 非脏块列表算法
最初,非脏块列表是最近最少使用(LRU)列表,块按使用顺序列出。在Oracle的后续版本中,算法略有修改。Oracle采用了触摸计数算法,当你在缓存中访问一个块时,会有效地增加与该块关联的计数器。如果持续访问该块,大约每三秒计数器会增加一次。可以在X$表中看到该算法的工作情况,X$表是Oracle完全未记录的表,但有关它们的信息会不时泄露出来。
### 4.3 查询示例
以下是一些查询示例,用于查看块的触摸计数:
```sql
--
```
0
0
复制全文
相关推荐









