SGA 各组件作用与配置

SGA 各组件作用与配置

适用版本:Oracle Database 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07


1. 概述

SGA(System Global Area) 是 Oracle 实例的共享内存区,所有服务器进程和后台进程都能访问[1]。

SGA 主要组件

组件作用必需
Database Buffer Cache缓存数据块
Shared Pool缓存 SQL、PL/SQL、字典
Redo Log Buffer缓存 Redo 记录
Large Pool大块内存分配(RMAN/共享服务器)
Java PoolJava 程序内存
Streams PoolStreams/GoldenGate 内存
Fixed SGA内部数据结构自动

2. 查看当前 SGA 配置

-- SGA 总体信息
SELECT * FROM v$sga;

-- SGA 详细信息
SELECT * FROM v$sgainfo;

-- SGA 动态组件
SELECT 
  name, 
  bytes/1024/1024 AS mb, 
  resizeable
FROM v$sga_dynamic_components;

-- SGA 参数
SHOW PARAMETER sga;
SHOW PARAMETER memory;

3. Database Buffer Cache

3.1 作用

缓存从数据文件读取的数据块,减少磁盘 I/O[2]。

3.2 关键参数

SHOW PARAMETER db_cache_size;
SHOW PARAMETER db_block_size;
SHOW PARAMETER db_nk_cache_size;     -- 非标准块大小
SHOW PARAMETER db_keep_cache_size;   -- KEEP 池
SHOW PARAMETER db_recycle_cache_size; -- RECYCLE 池

3.3 多缓冲池

-- KEEP 池:常驻缓存的小表
ALTER TABLE small_lookup_table STORAGE (BUFFER_POOL KEEP);

-- RECYCLE 池:访问少的大表
ALTER TABLE large_history_table STORAGE (BUFFER_POOL RECYCLE);

-- DEFAULT 池:默认(大多数表)

3.4 查看 Buffer Cache 命中率

SELECT 
  1 - (physical.value - direct.value - lobs.value) / NULLIF(consistent.value + dbblk.value, 0) AS hit_ratio
FROM 
  v$sysstat physical,
  v$sysstat direct,
  v$sysstat lobs,
  v$sysstat consistent,
  v$sysstat dbblk
WHERE 
  physical.name = 'physical reads cache'
  AND direct.name = 'physical reads direct'
  AND lobs.name = 'physical reads direct (lob)'
  AND consistent.name = 'consistent gets'
  AND dbblk.name = 'db block gets';
-- 健康标准:> 95%

4. Shared Pool

4.1 作用

缓存 SQL/PL/SQL 代码、数据字典、解析树等[3]。

4.2 关键组件

子组件作用
Library CacheSQL/PL/SQL 解析结果
Data Dictionary Cache数据字典缓存(rowcache)
Result Cache查询结果缓存
Reserved Pool大块内存预留

4.3 配置

SHOW PARAMETER shared_pool_size;
SHOW PARAMETER shared_pool_reserved_size;
SHOW PARAMETER result_cache_size;

4.4 查看 Shared Pool 使用

SELECT 
  pool, 
  name, 
  bytes/1024/1024 AS mb
FROM v$sgastat
WHERE pool = 'shared pool'
ORDER BY bytes DESC;

5. Redo Log Buffer

5.1 作用

缓存 Redo 记录,LGWR 进程将其写入 Redo Log 文件。

5.2 配置

SHOW PARAMETER log_buffer;
-- 默认 14MB,最小 64KB

5.3 LGWR 写入触发

  • 每 3 秒
  • 用户 COMMIT
  • Buffer 1/3 满(或 1MB)
  • DBWn 写脏块前

详细内容见:Oracle 重做日志 Redo Log 机制详解


6. Large Pool

6.1 作用

避免 Shared Pool 碎片化,为大块内存分配预留:

  • RMAN 备份/恢复
  • 共享服务器 UGA
  • 并行查询消息缓冲区

6.2 配置

SHOW PARAMETER large_pool_size;
-- 默认 0(自动管理)

-- 手动配置
ALTER SYSTEM SET large_pool_size=256M SCOPE=BOTH;

7. Java Pool

7.1 作用

Java 程序执行内存(如 Java 存储过程)。

7.2 配置

SHOW PARAMETER java_pool_size;
-- 默认 0(自动管理)

8. Streams Pool

8.1 作用

Oracle Streams / GoldenGate / LogMiner 使用的内存。

8.2 配置

SHOW PARAMETER streams_pool_size;
-- 默认 0(自动管理)

9. SGA 内存管理方式

9.1 三种管理方式

方式参数说明
手动管理各组件独立设置灵活但繁琐
ASMMSGA_TARGETSGA 内自动分配
AMMMEMORY_TARGETSGA + PGA 统一管理

9.2 ASMM 配置

-- 启用 ASMM
ALTER SYSTEM SET sga_target=8G SCOPE=BOTH;
ALTER SYSTEM SET sga_max_size=8G SCOPE=SPFILE;

-- 各组件设为 0(自动)
ALTER SYSTEM SET shared_pool_size=0 SCOPE=BOTH;
ALTER SYSTEM SET db_cache_size=0 SCOPE=BOTH;
ALTER SYSTEM SET large_pool_size=0 SCOPE=BOTH;
ALTER SYSTEM SET java_pool_size=0 SCOPE=BOTH;
ALTER SYSTEM SET streams_pool_size=0 SCOPE=BOTH;

9.3 AMM 配置

-- 启用 AMM(11g+)
ALTER SYSTEM SET memory_target=12G SCOPE=SPFILE;
ALTER SYSTEM SET memory_max_target=16G SCOPE=SPFILE;
-- 重启生效

9.4 ASMM vs AMM

维度ASMMAMM
范围SGA 内SGA + PGA
HugePages兼容不兼容(Linux)
推荐OLTP通用
控制粒度

Linux 生产推荐:ASMM + HugePages(性能最佳)。


10. 常见坑与排错

10.1 ORA-04031: unable to allocate string bytes of shared memory

现象:Shared Pool 空间不足。

修复

-- 1. 增大 Shared Pool
ALTER SYSTEM SET shared_pool_size=2G SCOPE=BOTH;

-- 2. 查看 Shared Pool 详情
SELECT pool, name, bytes/1024/1024 AS mb 
FROM v$sgastat 
WHERE pool='shared pool' 
ORDER BY bytes DESC;

-- 3. 刷新 Shared Pool(临时)
ALTER SYSTEM FLUSH SHARED_POOL;

-- 4. 优化 SQL 使用绑定变量(根本解决)

10.2 Buffer Cache 命中率低

-- 检查命中率(应 > 95%)
SELECT name, value 
FROM v$sysstat 
WHERE name IN ('consistent gets','db block gets','physical reads cache');

修复

  • 增大 Buffer Cache
  • 优化全表扫描 SQL
  • 为小表使用 KEEP 池

10.3 ASMM 自动调整失败

现象v$sga_dynamic_components 显示组件大小固定不变。

原因:某些参数被手动设置,覆盖了 ASMM。

修复

-- 将所有 SGA 子组件设为 0
ALTER SYSTEM SET shared_pool_size=0 SCOPE=BOTH;
ALTER SYSTEM SET db_cache_size=0 SCOPE=BOTH;
-- ...

10.4 AMM 与 HugePages 冲突

现象:Linux 上使用 AMM 后,HugePages 利用率低。

修复:改用 ASMM + HugePages。

# 计算 HugePages 需求
# HugePages 数 = SGA_TARGET / Hugepagesize(通常 2MB)

# /etc/sysctl.conf
vm.nr_hugepages = 4096    # 假设 8GB SGA / 2MB = 4096

# /etc/security/limits.conf
oracle soft memlock unlimited
oracle hard memlock unlimited

11. 最佳实践

  1. 生产用 ASMM + HugePages:性能与稳定性最佳
  2. Shared Pool ≥ 1GB:避免硬解析频繁
  3. Buffer Cache 占 SGA 60-70%:最大化缓存命中
  4. 小表用 KEEP 池:减少缓存争用
  5. 大表用 RECYCLE 池:避免挤占默认池
  6. 监控命中率:定期检查 Buffer Cache、Library Cache 命中率
  7. 优化 SQL 减少硬解析:使用绑定变量
  8. 保留参数默认值:除非有明确依据,否则不要手动调整

12. 参考资料

[1] Oracle Database Concepts 19c, “Memory Architecture” https://docs.oracle.com/en/database/oracle/oracle-database/19/cncpt/memory-architecture.html

[2] Oracle Database Administrator’s Guide 19c, “Managing the Buffer Cache” https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/managing-memory.html

[3] Oracle Database Administrator’s Guide 19c, “Managing the Shared Pool” https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/managing-memory.html