1.1、自动内存管理(AMM)
AMM(Automatic Memory Management)是 Oracle 11g 引入的内存管理方式,通过 MEMORY_TARGET 和 MEMORY_MAX_TARGET 参数自动管理 SGA 和 PGA。Oracle 12c+ 在 Linux 上默认使用 AMM(使用 /dev/shm 共享内存)。
案例:AMM 配置与监控
**S --- Situation(场景):**某小型数据库服务器(64GB 内存),希Oracle 自动管理 SGA 和 PGA,减少 DBA 干预。
**T --- Task(任务):**配置 AMM 并监控内存分配情况。
A --- Action(行动):
1、设置 AMM 参数:
ALTER SYSTEM SET MEMORY_TARGET = 40G SCOPE=SPFILE;
ALTER SYSTEM SET MEMORY_MAX_TARGET = 48G SCOPE=SPFILE;
-- MEMORY_MAX_TARGET >= MEMORY_TARGET
-- MEMORY_MAX_TARGET 是静态参数,需重启
2、清除 SGA/PGA 手动参数(AMM 模式下自动管理):
ALTER SYSTEM SET SGA_TARGET = 0 SCOPE=SPFILE;
ALTER SYSTEM SET PGA_AGGREGATE_TARGET = 0 SCOPE=SPFILE;
3、重启数据库:
SHUTDOWN IMMEDIATE;
STARTUP;
4、监控内存分配:
SELECT COMPONENT, CURRENT_SIZE/1024/1024 AS MB,MIN_SIZE/1024/1024 AS MIN_MB,MAX_SIZE/1024/1024 AS MAX_MB FROM V$MEMORY_DYNAMIC_COMPONENTS ORDER BY CURRENT_SIZE DESC;
5、查看内存建议
SELECT * FROM V$MEMORY_TARGET_ADVICE;
**R --- Result(结果):**AMM 配置完成,SGA 和 PGA 自动在 40GB 范围内动态调整。DBA 无需手动干预内存分配,系统根据负载自动优化。
1.2、自动共享内存管理(ASMM)
ASMM(Automatic Shared Memory Management)通过 SGA_TARGET 参数自动管理 SGA 内部组件,但 PGA 仍需单独配置。这是生产环境推荐的内存管理方式。
案例:ASMM 生成环境配置最佳实践
**S --- Situation(场景):**某 OLTP 数据库(256GB 内存),之前使用手动内存管理,各组件大小不合理,Shared Pool 经常 ORA-04031 错误。
**T --- Task(任务):**迁移到 ASMM,优化内存分配。
A --- Action(行动):
1、评估当前内存使用:
SELECT COMPONENT, CURRENT_SIZE/1024/1024 AS MB FROM V$SGA_DYNAMIC_COMPONENTS;
2、计算合理的 SGA_TARGET:
-- 当前 SGA 各组件总和约 60GB,建议 SGA_TARGET = 80GB
ALTER SYSTEM SET SGA_TARGET = 80G SCOPE=BOTH;
ALTER SYSTEM SET SGA_MAX_SIZE = 80G SCOPE=SPFILE;
3、设置各组件最小值(防止自动收缩过多):
ALTER SYSTEM SET SHARED_POOL_SIZE = 16G SCOPE=BOTH;
ALTER SYSTEM SET DB_CACHE_SIZE = 32G SCOPE=BOTH;
ALTER SYSTEM SET LARGE_POOL_SIZE = 2G SCOPE=BOTH;
4、单独配置 PGA:
ALTER SYSTEM SET PGA_AGGREGATE_TARGET = 48G SCOPE=BOTH;
ALTER SYSTEM SET PGA_AGGREGATE_LIMIT = 64G SCOPE=BOTH;
5、验证配置:
SHOW PARAMETER SGA;
SHOW PARAMETER PGA;
**R --- Result(结果):**迁移到 ASMM 后,SGA 各组件自动根据负载调整。Shared Pool 不再出现 ORA-04031,Buffer Cache 命名率提升至 99%。PGA 单独管理,OLAP 查询不再影响 SGA。
1.3、手动内存管理
在某些特殊场景(如需要精确控制内存分配),DBA 可以选择手动管理 SGA 各组件。手动管理需要设置每个组件的大小,不会自动调整。
注意:Oracle 12c+ 推荐使用 ASMM 或 AMM,手动管理仅用于特殊需求或兼容旧版本。
*1.4、*PGA 管理与 PGA_AGGREGATE_TARGET
案例:PGA 调优:排序区与哈希区优化
**S --- Situation(场景):**某数据仓库系统执行大量 ORDER BY 和 HASH JOIN 操作,AWR 报告显示大量 TEMP 表空间使用,排序操作溢出到磁盘。
**T --- Task(任务):**优化 PGA 配置,减少磁盘排序。
A --- Action(行动):
1、 查看 PGA 统计信息:
SELECT NAME, VALUE FROM V$PGASTAT WHERE NAME IN ('over allocation count', 'total PGA allocated', 'extra bytes read/written to disk', 'cache hit percentage');
2、查看 PGA 建议:
SELECT PGA_TARGET_FOR_ESTIMATE/1024/1024 AS TARGET_MB,PGA_TARGET_FACTOR,ESTD_OVERALLOC_COUNT,ESTD_EXTRA_BYTES_RW/1024/1024 AS EXTRA_RW_MB FROM V$PGA_TARGET_ADVICE;
3、增加 PGA_AGGREGATE_TARGET:
ALTER SYSTEM SET PGA_AGGREGATE_TARGET = 64G SCOPE=BOTH;
4、设置 PGA 硬限制:
ALTER SYSTEM SET PGA_AGGREGATE_LIMIT = 80G SCOPE=BOTH;
5、验证改善:
-- 重新执行 AWR 报告,检查 cache hit percentage
-- 预期从 60% 提升到 90%+
**R --- Result(结果):**PGA cache hit percentage 从 60% 提升到 95%,磁盘排序减少 80%。报表查询时间从 45 分钟缩短到 12 分钟。
1.5、Oracle 12c+ 新特性:IMCU 与 IMDB 缓存
Oracle 12c 引入了 In-Memory 选项,允许将表和分区以列式格式存储在 SGA 的 In-Memory Area 中,大幅加速分析查询。
**S --- Situation(场景):**某混合负载数据库同时运行 OLTP 和 OLAP 查询,分析查询需要扫描大量数据行,影响 OLTP 性能。
**T --- Task(任务):**启用 In-Memory 选项,加速分析查询而不影响 OLTP。
A --- Action(行动):
1、 配置 In-Memory 区域大小:
ALTER SYSTEM SET INMEMORY_SIZE = 16G SCOPE=SPFILE;
-- 静态参数,需重启
2、重启数据库:
SHUTDOWN IMMEDIATE;
STARTUP;
3、将分析表启用 In-Memory:
ALTER TABLE SALES INMEMORY;
ALTER TABLE CUSTOMERS INMEMORY;
4、查看 In-Memory 对象:
SELECT OWNER, TABLE_NAME, INMEMORY_PRIORITY,INMEMORY_COMPRESSION,BYTES/1024/1024 AS SIZE_MB FROM V$IM_SEGMENTS;
5、验证查询性能提升:
-- 启用前:SELECT COUNT(*) FROM SALES WHERE AMOUNT > 1000;
-- 执行时间:2.3 秒
-- 启用后:同一查询执行时间:0.08 秒
-- 提升约 28 倍
**R --- Result(结果):**分析查询性能提升 10-100 倍,OLTP 查询不受影响。In-Memory 选项以列式格式存储热数据,利用 SIMD 指令加速扫描和聚合。