目录
一、系统全局区(SGA, System Global Area)概括
Oracle 的 系统全局区(SGA, System Global Area) 是数据库实例中非常重要的内存区域,用于存储共享数据和控制信息,以便多个会话可以共享这些数据。SGA 的核心目标是减少磁盘 I/O 操作,提高数据库性能,并管理数据库实例的运行时信息。SGA 是 Oracle 实例在启动时分配的,它由多个关键组件构成,每个组件在数据库的正常运行和性能优化中起着重要作用。
二、共享池(Shared Pool)
共享池 是 SGA 中的一个内存区域,主要用于存储 SQL 语句、PL/SQL 代码和元数据,以便在不同会话间共享,减少 SQL 语句的重新解析。共享池包含库高速缓冲区(library cache)和字典高速缓冲区(dictionary cache)。
共享池的内存空间大小是可以被动态改变的,一般通过修改参数SHARED_POOL_SIZE的值来实现。
2.1 库高速缓冲区(library cache)
- 库缓存保存已经解析的 SQL 语句、PL/SQL 块及其执行计划。这样可以避免同样的 SQL 语句重复解析,提高性能。
- 如果一个 SQL 语句或 PL/SQL 代码已经在库缓存中,当其他会话执行相同的语句时,可以直接重用解析好的版本。
- 硬解析(Hard Parse):当一个 SQL 语句首次执行或不在缓存中时,需要进行硬解析,包括解析语法、验证权限、生成执行计划。
- 软解析(Soft Parse):如果 SQL 语句已经在缓存中,可以直接重用执行计划,减少解析时间。
2.2 字典高速缓冲区(dictionary cache)
- 数据字典缓存存储数据库对象的元数据,如表、索引、用户权限等。这个缓存减少了数据库查询和管理操作时频繁读取数据字典表的需求。
三、数据库缓冲区缓存(Database Buffer Cache)
数据库缓冲区缓存 是 Oracle SGA 中最大且最重要的组件之一,用于存储从数据文件中读取的数据块。Oracle 使用最近最少使用(LRU,Least Recently Used)算法管理缓冲区中的数据块,优先保留最近使用的数据块,逐出长时间未使用的块。
- 脏数据区。脏数据区中存储着已被修改过的数据,这些数据等待被写入数据文件中。当一条更新或删除语句对某些数据块中的数据修改后,那么这些数据块就被标记为“脏”,然后等待提交命令并通过后台进程DBWR将其写入数据文件中。
- 空闲区。空闲区中的数据块不包含任何数据,这些数据块可以被写入数据,Oracle可以从数据文件中读取数据块,并将其存储到该区中。
- 保留区。保留区包含那些正在被用户访问的数据块和明确保留以作为将来使用的数据块(即缓存块),这些数据块将被保留在缓冲区中。
四、重做日志缓冲区(Redo Log Buffer)
重做日志缓冲区 存储事务对数据库的所有更改信息,这些信息被称为重做条目。重做条目是数据库恢复和一致性的关键。
- 事务变化记录:每当事务修改数据时,这些更改会首先写入重做日志缓冲区,而不是立即写入磁盘。
- 日志写进程(LGWR):当事务提交时,重做日志缓冲区的内容会被写入磁盘上的联机重做日志文件,确保即使系统崩溃,也可以通过这些重做条目恢复数据。
- 恢复用途:重做日志用于数据库崩溃恢复。它帮助 Oracle 在实例故障或系统崩溃后重做尚未写入磁盘的事务,以保持数据一致性。
五、大型池(Large Pool)
大型池在SGA区中不是必需的内存结构,只有在某些特殊情况下,实例才需要使用大型池来减轻共享池的访问压力。大型池的缓存区大小是通过LARGE_POOL_SIZE参数定义的,在Oracle中,用户可以使用ALTER SYSTEM命令动态地修改其缓存区的大小。
- 当使用恢复管理器进行备份和恢复操作时,大型池将作为I/O缓冲区使用。
- 当使用I/O Slave仿真异步I/O功能时,大型池将被当作I/O缓冲区使用。
- 执行具有大量排序操作的SQL语句。
- 当使用并行查询时,大型池将作为并行查询进程彼此交换信息的地方。
六、Java 池(Java Pool)
Oracle流池用于在数据库与数据库之间进行信息共享。如果没有用到Oracle流,就不需要设置该池。Oracle流池的大小由参数streams_pool_size决定。
七、流池(Streams Pool)
Oracle流池用于在数据库与数据库之间进行信息共享。如果没有用到Oracle流,就不需要设置该池。Oracle流池的大小由参数streams_pool_size决定。