Skip to content

Oracle 内存结构

系统全局区(SGA)

SGA 组成部分

数据库缓冲区高速缓存(Database Buffer Cache)

  • 功能:存储从数据文件中读取的数据块的副本
  • 作用:减少物理I/O,提高数据访问速度
  • 管理:由LRU(最近最少使用)算法管理
  • 大小:由 DB_CACHE_SIZE 参数控制
  • 缓冲区类型:默认缓冲区、KEEP缓冲区、RECYCLE缓冲区

共享池(Shared Pool)

  • 功能:存储SQL语句、PL/SQL程序、数据字典信息等
  • 组成
    • 库缓存(Library Cache):存储SQL和PL/SQL语句的解析结果
    • 数据字典缓存(Dictionary Cache):存储数据字典信息
    • 结果缓存(Result Cache):存储SQL查询结果
  • 大小:由 SHARED_POOL_SIZE 参数控制
  • 重要性:共享池大小直接影响SQL执行效率

重做日志缓冲区(Redo Log Buffer)

  • 功能:存储数据库变更的重做记录
  • 作用:提高重做日志写入性能
  • 大小:由 LOG_BUFFER 参数控制
  • 写入:由LGWR进程定期写入重做日志文件

大型池(Large Pool)

  • 功能:为大型操作提供内存空间
  • 用途
    • RMAN备份和恢复操作
    • 共享服务器模式下的会话内存
    • Oracle XA事务
  • 大小:由 LARGE_POOL_SIZE 参数控制

Java池(Java Pool)

  • 功能:为Java虚拟机(JVM)提供内存空间
  • 用途:存储Java代码和数据
  • 大小:由 JAVA_POOL_SIZE 参数控制

流池(Streams Pool)

  • 功能:为Oracle Streams提供内存空间
  • 用途:存储流处理相关的数据
  • 大小:由 STREAMS_POOL_SIZE 参数控制

网格内联数据库缓存(In-Memory Column Store)

  • 功能:以列式格式存储表数据,提高分析查询性能
  • 用途:加速数据仓库和分析型应用
  • 大小:由 INMEMORY_SIZE 参数控制
  • 适用版本:Oracle Database 12c及以上版本

SGA 管理

自动内存管理(AMM)

  • 功能:Oracle自动管理SGA和PGA的大小
  • 参数:由 MEMORY_TARGETMEMORY_MAX_TARGET 参数控制
  • 优势:简化内存管理,自动适应工作负载变化
  • 适用版本:Oracle Database 11g及以上版本

自动共享内存管理(ASMM)

  • 功能:Oracle自动管理SGA内部各组件的大小
  • 参数:由 SGA_TARGETSGA_MAX_SIZE 参数控制
  • 优势:自动调整SGA各组件大小,适应工作负载变化
  • 适用版本:Oracle Database 10g及以上版本

手动内存管理

  • 功能:数据库管理员手动配置SGA各组件的大小
  • 参数:手动设置 DB_CACHE_SIZESHARED_POOL_SIZE 等参数
  • 优势:管理员可以根据具体情况精细调整内存分配
  • 劣势:需要更多的管理经验和监控

SGA 参数配置

关键参数

参数描述默认值建议值
SGA_TARGETSGA自动管理的目标大小0根据服务器内存大小设置,通常为服务器内存的40-60%
SGA_MAX_SIZESGA的最大大小0大于等于SGA_TARGET,通常为服务器内存的60-80%
DB_CACHE_SIZE数据库缓冲区高速缓存大小自动计算通常为SGA的30-50%
SHARED_POOL_SIZE共享池大小自动计算通常为SGA的20-30%
LOG_BUFFER重做日志缓冲区大小自动计算通常为16-128MB
LARGE_POOL_SIZE大型池大小自动计算根据需要设置,通常为64-256MB
JAVA_POOL_SIZEJava池大小自动计算根据需要设置,通常为64-256MB
STREAMS_POOL_SIZE流池大小自动计算根据需要设置,通常为64-256MB
INMEMORY_SIZE内存列存储大小0根据需要设置

参数调整原则

  • 根据服务器内存:考虑服务器的总内存大小
  • 根据工作负载:OLTP系统和OLAP系统的内存需求不同
  • 监控调整:根据实际监控结果调整参数
  • 循序渐进:参数调整应循序渐进,避免大幅变更

程序全局区(PGA)

PGA 组成部分

排序区(Sort Area)

  • 功能:存储排序操作的中间结果
  • 大小:由 PGA_AGGREGATE_TARGET 和工作区大小策略控制
  • 管理:自动管理或手动管理

哈希区(Hash Area)

  • 功能:存储哈希连接等操作的中间结果
  • 大小:由 PGA_AGGREGATE_TARGET 和工作区大小策略控制
  • 管理:自动管理或手动管理

会话内存(Session Memory)

  • 功能:存储会话的私有数据和控制信息
  • 内容:会话变量、游标状态、绑定变量值等
  • 大小:通常较小,每个会话几KB到几十KB

堆内存(Heap Memory)

  • 功能:存储进程运行时的临时数据
  • 内容:SQL执行计划、PL/SQL变量等
  • 大小:根据进程活动动态变化

PGA 管理

自动PGA管理

  • 功能:Oracle自动管理PGA的大小
  • 参数:由 PGA_AGGREGATE_TARGET 参数控制
  • 优势:简化PGA管理,自动适应工作负载变化
  • 适用版本:Oracle Database 9i及以上版本

手动PGA管理

  • 功能:数据库管理员手动配置PGA相关参数
  • 参数:手动设置 SORT_AREA_SIZEHASH_AREA_SIZE 等参数
  • 优势:管理员可以根据具体情况精细调整PGA分配
  • 劣势:需要更多的管理经验和监控

PGA 参数配置

关键参数

参数描述默认值建议值
PGA_AGGREGATE_TARGETPGA聚合目标大小自动计算根据服务器内存大小设置,通常为服务器内存的10-30%
PGA_AGGREGATE_LIMITPGA聚合限制大小自动计算大于等于PGA_AGGREGATE_TARGET
WORKAREA_SIZE_POLICY工作区大小策略AUTOAUTO(自动)或MANUAL(手动)
SORT_AREA_SIZE排序区大小65536仅在手动模式下使用
HASH_AREA_SIZE哈希区大小131072仅在手动模式下使用

参数调整原则

  • 根据服务器内存:考虑服务器的总内存大小
  • 根据工作负载:OLTP系统和OLAP系统的PGA需求不同
  • 监控调整:根据实际监控结果调整参数
  • 循序渐进:参数调整应循序渐进,避免大幅变更

内存结构与数据库性能

内存对性能的影响

  • SGA大小:影响数据缓存能力和共享资源利用率
  • PGA大小:影响排序、哈希等操作的性能
  • 内存分配:合理的内存分配可以减少物理I/O,提高响应速度
  • 内存不足:会导致频繁的I/O操作,严重影响性能

不同工作负载的内存需求

OLTP系统

  • 特点:事务短,并发高,数据访问随机
  • SGA需求:较大的数据库缓冲区高速缓存
  • PGA需求:较小的PGA,因为事务短,排序操作少
  • 内存配置:SGA占总内存的比例较高,PGA占比较低

OLAP系统

  • 特点:查询复杂,事务长,数据访问顺序
  • SGA需求:较大的共享池和数据库缓冲区高速缓存
  • PGA需求:较大的PGA,因为有大量排序和哈希操作
  • 内存配置:PGA占总内存的比例较高,SGA占比较低

混合系统

  • 特点:同时包含OLTP和OLAP工作负载
  • 内存配置:平衡SGA和PGA的分配,根据实际工作负载调整

内存监控

内存监控视图

SGA监控视图

  • V$SGA:显示SGA的总体大小和各组件大小
  • V$SGAINFO:显示SGA更详细的信息
  • V$SGASTAT:显示SGA各组件的详细统计信息
  • V$SGA_DYNAMIC_COMPONENTS:显示SGA动态组件的大小变化
  • V$SGA_DYNAMIC_FREE_MEMORY:显示SGA中的空闲内存

PGA监控视图

  • V$PGASTAT:显示PGA的统计信息
  • V$PROCESS_MEMORY:显示每个进程的内存使用情况
  • V$SQL_WORKAREA:显示SQL工作区的使用情况
  • V$SQL_WORKAREA_ACTIVE:显示当前活动的SQL工作区

内存使用监控视图

  • V$MEMORY_TARGET_ADVICE:提供内存目标大小的建议
  • V$SGA_TARGET_ADVICE:提供SGA目标大小的建议
  • V$PGA_TARGET_ADVICE:提供PGA目标大小的建议

内存监控工具

Oracle Enterprise Manager

  • 功能:图形化界面监控内存使用情况
  • 优势:直观,易于使用,提供趋势分析
  • 组件:内存仪表板,内存使用趋势图

AWR报告

  • 功能:自动工作负载仓库报告,包含内存使用统计信息
  • 优势:详细的内存使用统计,历史趋势分析
  • 内容:SGA和PGA使用情况,内存相关等待事件

ASH报告

  • 功能:活动会话历史报告,包含内存相关等待事件
  • 优势:实时监控内存相关性能问题
  • 内容:内存相关等待事件,会话内存使用情况

内存监控指标

SGA监控指标

  • 缓冲区缓存命中率:理想值>95%
  • 共享池命中率:理想值>95%
  • 库缓存命中率:理想值>95%
  • 数据字典缓存命中率:理想值>95%

PGA监控指标

  • PGA使用率:理想值<70%
  • 工作区溢出率:理想值<1%
  • 排序区使用率:理想值<90%

内存等待事件

  • buffer busy waits:缓冲区忙等待
  • free buffer waits:空闲缓冲区等待
  • latch: shared pool:共享池闩锁等待
  • latch: cache buffers chains:缓存缓冲区链闩锁等待

内存优化

SGA优化

数据库缓冲区高速缓存优化

  • 调整大小:根据缓冲区缓存命中率调整 DB_CACHE_SIZE
  • 使用多个缓冲区池:为不同类型的数据使用不同的缓冲区池
  • 优化SQL语句:减少全表扫描,提高缓冲区缓存利用率
  • 使用分区表:提高数据访问效率

共享池优化

  • 调整大小:根据共享池命中率调整 SHARED_POOL_SIZE
  • 使用绑定变量:减少硬解析,提高共享池利用率
  • 优化SQL语句:减少SQL语句的复杂性,提高共享率
  • 使用共享池保留区:为大型PL/SQL对象预留空间

重做日志缓冲区优化

  • 调整大小:根据重做日志缓冲区等待事件调整 LOG_BUFFER
  • 优化LGWR:确保LGWR进程有足够的资源
  • 减少重做生成:使用NOLOGGING选项,优化批量操作

PGA优化

工作区大小优化

  • 调整PGA_AGGREGATE_TARGET:根据工作负载调整PGA大小
  • 使用自动PGA管理:让Oracle自动管理PGA大小
  • 优化SQL语句:减少排序和哈希操作,优化连接顺序

会话内存优化

  • 减少并发会话数:根据服务器资源调整最大会话数
  • 优化应用程序:减少会话级别的资源消耗
  • 使用连接池:减少会话创建和销毁的开销

内存分配优化

总内存分配

  • 根据服务器内存:合理分配服务器内存,避免内存过度分配
  • 考虑操作系统需求:为操作系统预留足够的内存
  • 考虑其他应用:如果服务器上还有其他应用,为它们预留足够的内存

内存参数调优

  • 使用自动内存管理:对于经验不足的管理员,建议使用AMM
  • 监控和调整:定期监控内存使用情况,根据需要调整参数
  • 使用内存 advisors:利用Oracle提供的内存建议工具

内存管理的版本差异

Oracle 9i

  • 内存管理:引入PGA自动管理
  • 参数PGA_AGGREGATE_TARGET 参数

Oracle 10g

  • 内存管理:引入自动共享内存管理(ASMM)
  • 参数SGA_TARGETSGA_MAX_SIZE 参数

Oracle 11g

  • 内存管理:引入自动内存管理(AMM)
  • 参数MEMORY_TARGETMEMORY_MAX_TARGET 参数

Oracle 12c

  • 内存管理:增强自动内存管理功能
  • 新特性:引入内存列存储(In-Memory Column Store)
  • 参数INMEMORY_SIZE 参数

Oracle 18c/19c

  • 内存管理:进一步增强内存管理功能
  • 新特性:自动内存管理的改进,内存列存储的增强
  • 参数:新增和改进了一些内存相关参数

内存结构最佳实践

内存配置最佳实践

  • 使用自动内存管理:对于大多数环境,建议使用AMM或ASMM
  • 合理设置内存大小:根据服务器内存大小和工作负载设置合理的内存目标
  • 为操作系统预留内存:通常为服务器总内存的20-30%
  • 监控内存使用:定期监控内存使用情况,根据需要调整

不同环境的内存配置建议

开发环境

  • 内存配置:内存配置可以相对较小
  • 自动内存管理:建议使用AMM
  • 参数设置MEMORY_TARGET 设置为服务器内存的50-60%

测试环境

  • 内存配置:内存配置应接近生产环境
  • 自动内存管理:建议使用AMM或ASMM
  • 参数设置:根据测试需求调整内存参数

生产环境

  • 内存配置:内存配置应充足
  • 内存管理:根据管理员经验选择AMM、ASMM或手动管理
  • 参数设置:根据工作负载类型和服务器内存大小调整
  • 监控:建立完善的内存监控机制

内存故障处理

内存不足

  • 症状:频繁的I/O操作,性能下降,ORA-4030错误
  • 处理:增加内存大小,优化SQL语句,减少并发会话数

内存泄漏

  • 症状:内存使用持续增长,最终导致内存不足
  • 处理:识别导致内存泄漏的进程或SQL语句,优化代码

内存过度分配

  • 症状:服务器内存使用接近100%,操作系统性能下降
  • 处理:减少数据库内存分配,为操作系统预留足够内存

内存结构与其他组件的关系

内存结构与物理结构的关系

  • 数据文件:内存结构中的数据库缓冲区高速缓存存储数据文件中数据块的副本
  • 重做日志文件:内存结构中的重做日志缓冲区存储要写入重做日志文件的数据
  • 控制文件:内存结构中存储控制文件的副本,用于实例恢复

内存结构与进程结构的关系

  • 后台进程:后台进程访问SGA,执行各种数据库操作
  • 服务器进程:服务器进程访问SGA和PGA,处理用户请求
  • 用户进程:用户进程通过服务器进程访问数据库,有自己的PGA

内存结构与逻辑结构的关系

  • 表空间:内存结构中的数据库缓冲区高速缓存存储表空间中数据的数据块
  • :内存结构中的数据库缓冲区高速缓存存储段中数据的数据块
  • 数据字典:内存结构中的数据字典缓存存储数据字典信息

未来发展趋势

内存数据库技术

  • 内存数据库:完全基于内存的数据库技术
  • 混合存储:结合内存和磁盘存储的优势
  • 列式存储:内存中使用列式存储,提高分析查询性能

智能内存管理

  • 自适应内存管理:根据工作负载自动调整内存分配
  • 机器学习:使用机器学习算法预测内存需求
  • 自优化:内存参数自动优化

内存技术的硬件发展

  • 大容量内存:服务器内存容量不断增加
  • 非易失性内存:NVMe、3D XPoint等非易失性内存技术的应用
  • 内存带宽:内存带宽不断提高

云环境中的内存管理

  • 弹性内存:根据需求动态调整内存分配
  • 内存优化:针对云环境的内存优化技术
  • 内存监控:云环境中的内存监控和管理工具

常见问题(FAQ)

Q1: Oracle数据库的内存结构主要包括哪些部分?

A1: Oracle数据库的内存结构主要包括两大部分:

  • 系统全局区(SGA):所有数据库进程共享的内存区域,包括数据库缓冲区高速缓存、共享池、重做日志缓冲区、大型池、Java池、流池等
  • 程序全局区(PGA):每个服务器进程或用户进程私有的内存区域,包括排序区、哈希区、会话内存、堆内存等

Q2: 自动内存管理(AMM)和自动共享内存管理(ASMM)有什么区别?

A2: 自动内存管理(AMM)和自动共享内存管理(ASMM)的区别:

  • AMM:Oracle自动管理SGA和PGA的大小,由 MEMORY_TARGET 参数控制,适用于Oracle 11g及以上版本
  • ASMM:Oracle自动管理SGA内部各组件的大小,由 SGA_TARGET 参数控制,PGA需要单独管理,适用于Oracle 10g及以上版本

Q3: 如何监控Oracle数据库的内存使用情况?

A3: 监控Oracle数据库内存使用情况的方法:

  • 使用动态性能视图V$SGAV$PGASTATV$MEMORY_TARGET_ADVICE
  • 使用Oracle Enterprise Manager:图形化界面监控内存使用情况
  • 生成AWR报告:分析内存使用统计信息和性能趋势
  • 使用ASH报告:分析当前活动会话的内存使用情况

Q4: 如何优化Oracle数据库的内存配置?

A4: 优化Oracle数据库内存配置的方法:

  • 根据工作负载类型:OLTP系统需要较大的SGA,OLAP系统需要较大的PGA
  • 使用自动内存管理:对于大多数环境,建议使用AMM或ASMM
  • 监控内存使用:根据内存使用情况和性能指标调整内存参数
  • 优化SQL语句:减少内存密集型操作,提高内存利用率
  • 合理设置内存参数:根据服务器内存大小和工作负载设置合理的内存参数

Q5: 什么是Oracle的内存列存储(In-Memory Column Store)?

A5: Oracle的内存列存储(In-Memory Column Store)是Oracle 12c引入的一项新特性:

  • 功能:以列式格式存储表数据,提高分析查询性能
  • 存储:存储在SGA的一个特殊区域中
  • 启用:通过 INMEMORY_SIZE 参数启用
  • 使用:通过 INMEMORY 子句为表或分区启用内存列存储
  • 优势:大幅提高分析查询性能,适用于数据仓库和分析型应用

Q6: 如何处理Oracle的ORA-4030错误?

A6: ORA-4030错误表示PGA内存不足,处理方法:

  • 增加PGA_AGGREGATE_TARGET:增加PGA的总大小
  • 优化SQL语句:减少排序和哈希操作,优化连接顺序
  • 减少并发会话数:根据服务器资源调整最大会话数
  • 使用绑定变量:减少硬解析,降低PGA使用
  • 检查内存泄漏:识别导致内存泄漏的进程或SQL语句

Q7: 如何处理Oracle的ORA-4031错误?

A7: ORA-4031错误表示SGA内存不足,处理方法:

  • 增加SGA大小:增加 SGA_TARGETMEMORY_TARGET 参数
  • 优化共享池使用:使用绑定变量,减少硬解析
  • 检查共享池内存泄漏:识别导致共享池内存泄漏的对象
  • 使用共享池保留区:为大型PL/SQL对象预留空间
  • 优化SQL语句:减少SQL语句的复杂性,提高共享率

Q8: 不同版本的Oracle数据库在内存管理方面有哪些主要变化?

A8: 不同版本Oracle数据库在内存管理方面的主要变化:

  • Oracle 9i:引入PGA自动管理
  • Oracle 10g:引入自动共享内存管理(ASMM)
  • Oracle 11g:引入自动内存管理(AMM)
  • Oracle 12c:引入内存列存储(In-Memory Column Store)
  • Oracle 18c/19c:增强自动内存管理功能,改进内存列存储

Q9: 如何为Oracle数据库选择合适的内存配置?

A9: 为Oracle数据库选择合适内存配置的方法:

  • 考虑服务器内存:根据服务器总内存大小确定数据库内存分配
  • 考虑工作负载类型:OLTP系统和OLAP系统的内存需求不同
  • 考虑版本特性:不同版本的Oracle数据库有不同的内存管理特性
  • 使用内存 advisors:利用Oracle提供的内存建议工具
  • 监控和调整:定期监控内存使用情况,根据需要调整内存配置

Q10: 内存结构对Oracle数据库性能的影响有哪些?

A10: 内存结构对Oracle数据库性能的影响:

  • SGA大小:影响数据缓存能力和共享资源利用率
  • PGA大小:影响排序、哈希等操作的性能
  • 内存分配:合理的内存分配可以减少物理I/O,提高响应速度
  • 内存不足:会导致频繁的I/O操作,严重影响性能
  • 内存过度分配:会导致操作系统性能下降,间接影响数据库性能
  • 内存管理方式:合适的内存管理方式可以提高内存利用率,优化性能