Oracle 数据库内存管理

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 指令加速扫描和聚合。

相关推荐
bzmK1DTbd1 小时前
ClickHouse列式存储:海量数据分析利器
clickhouse·oracle·数据分析
甲方大人请饶命1 小时前
SSM-基础
java·数据库·spring
Jackyzhe1 小时前
从零学习Kafka:幂等与事务
数据库·学习·kafka
六月雨滴2 小时前
Oracle 会话与进程管理
数据库·oracle
shark-chili2 小时前
基于claude code的redis慢查询指令复刻实践
数据库·redis·缓存
@我漫长的孤独流浪2 小时前
数据库完整性约束与安全机制全解析
数据库
px不是xp2 小时前
Docker部署Qdrant向量数据库,初始化向量数据库,重构RAG逻辑
数据库·docker·微信小程序·重构·qdrant
funnycoffee1232 小时前
Cisco Firewpower 4100 9300 FXOS change management ip address
linux·数据库·tcp/ip
Chase_______2 小时前
Java 基础语言 ③:流程控制与数组——从条件分支到数组遍历,一篇通关
java·数据库·python