Oracle 19c入门学习教程,从入门到精通,Oracle系统调优 —— 内存结构与参数优化详解(15)

Oracle系统调优 ------ 内存结构与参数优化详解


一、环境准备:Oracle 安装与调优前提

注意:系统调优需具备 DBA 权限,建议在测试环境(如 Oracle 21c XE)中操作。

1. 安装 Oracle Database 21c XE(简要回顾)

Windows / Linux 安装后验证:
bash 复制代码
sqlplus sys/your_password@localhost:1521/XE as sysdba

2. 调优前必备权限

确保当前用户具有以下权限(通常为 SYSSYSTEM):

sql 复制代码
GRANT ALTER SYSTEM TO your_dba_user;
-- 查看动态性能视图
GRANT SELECT ON v_$sga TO your_dba_user;
GRANT SELECT ON v_$parameter TO your_dba_user;
-- 其他常用视图:v$sgastat, v$pgastat, v$sysstat 等

💡 Oracle 21c 默认使用 自动内存管理(AMM)或自动共享内存管理(ASMM),但本章将深入手动调优细节。


二、核心语法知识点详解与案例


1. Oracle 初始化参数分类

Oracle 参数分为三类:

类型 特点 修改方式
静态参数 需重启生效 修改 spfile 后重启
动态参数(可立即生效) ALTER SYSTEM 即时生效 SCOPE = MEMORY
动态参数(可持久化) 可写入 spfile SCOPE = BOTH(默认)

✅ 推荐使用 spfile(二进制参数文件),而非 pfile(文本文件)。

查看参数当前值:
sql 复制代码
-- 查看所有参数
SHOW PARAMETER;

-- 查看特定参数(如 sga_target)
SHOW PARAMETER sga_target;

-- 查询 v$parameter 视图
SELECT name, value, isdefault, issys_modifiable 
FROM v$parameter 
WHERE name LIKE '%sga%';

2. 主要系统调优参数介绍

参数 作用 调优建议
MEMORY_TARGET 总内存(SGA + PGA)自动管理 Oracle 11g+ 推荐启用
SGA_TARGET SGA 自动管理总大小 若不用 MEMORY_TARGET,则设此值
PGA_AGGREGATE_TARGET PGA 总目标大小 控制排序、哈希等内存
DB_CACHE_SIZE 数据缓冲区大小 影响物理读性能
SHARED_POOL_SIZE 共享池大小 存储 SQL、PL/SQL、字典缓存
LOG_BUFFER 日志缓冲区大小 影响事务提交速度

⚠️ 若设置 MEMORY_TARGET > 0,则 SGA_TARGETPGA_AGGREGATE_TARGET 由 Oracle 自动分配。


3. 系统全局区(SGA)优化

3.1 理解 SGA 内存结构

SGA 由以下主要组件构成:

  • Database Buffer Cache:缓存数据块
  • Shared Pool:缓存 SQL、执行计划、数据字典
  • Redo Log Buffer:缓存重做日志
  • Large Pool(可选):用于 RMAN、并行查询
  • Java Pool(可选):Java 存储
  • Streams Pool(可选):流复制
查看 SGA 分配:
sql 复制代码
-- 查看 SGA 总体
SHOW SGA;

-- 详细各组件使用情况
SELECT * FROM v$sgastat ORDER BY pool, name;

4. 调整日志缓冲区(Redo Log Buffer)

作用:
  • 缓存事务产生的重做记录,减少磁盘 I/O。
  • 大小由 LOG_BUFFER 控制(静态参数,需重启)。
查看当前大小:
sql 复制代码
SHOW PARAMETER log_buffer;
-- 输出示例:log_buffer = 67108864 (约 64MB)
调整方法(需重启):
sql 复制代码
-- 创建 pfile 临时修改(不推荐生产直接改 spfile)
CREATE PFILE='/tmp/initXE.ora' FROM SPFILE;

-- 编辑 initXE.ora,添加:
-- *.log_buffer=134217728  -- 128MB

-- 重启数据库
SHUTDOWN IMMEDIATE;
STARTUP PFILE='/tmp/initXE.ora';

-- 重建 spfile(可选)
CREATE SPFILE FROM PFILE='/tmp/initXE.ora';

✅ 一般建议:OLTP 系统可设为 100--500 MB;若频繁出现 "log buffer space" 等待事件,则需增大。


5. 调整共享池(Shared Pool)

作用:
  • 存储 SQL 语句、执行计划、PL/SQL 代码、数据字典缓存
  • 过小 → 频繁硬解析(Hard Parse)→ CPU 飙升。
  • 过大 → 内存浪费。
关键参数:
sql 复制代码
-- 手动指定大小(若未启用 SGA_TARGET)
ALTER SYSTEM SET shared_pool_size = 512M SCOPE = BOTH;
监控共享池效率:
sql 复制代码
-- 计算软解析率(越高越好,>95% 为佳)
SELECT 
  1 - (SUM(reloads) / SUM(pins)) AS "Soft Parse Ratio"
FROM v$librarycache;
-- pins: 总访问次数,reloads: 重新加载次数(硬解析)

-- 查看共享池使用情况
SELECT 
  pool, name, bytes/1024/1024 AS mb
FROM v$sgastat 
WHERE pool = 'shared pool' AND name IN ('free memory', 'sql area', 'dictionary cache');

✅ 建议:启用 CURSOR_SHARING = FORCE(谨慎)或使用绑定变量减少硬解析。


6. 调整数据库缓冲区(DB Cache)

作用:
  • 缓存从磁盘读取的数据块,减少物理 I/O。
  • DB_CACHE_SIZE 控制(默认块大小缓存)。
调整语法:
sql 复制代码
-- 设置默认缓冲区为 1GB
ALTER SYSTEM SET db_cache_size = 1G SCOPE = BOTH;
监控缓存命中率:
sql 复制代码
-- 计算逻辑读 vs 物理读
SELECT 
  1 - (phy.value / (cur.value + con.value)) AS "Buffer Cache Hit Ratio"
FROM v$sysstat cur, v$sysstat con, v$sysstat phy
WHERE cur.name = 'db block gets'
  AND con.name = 'consistent gets'
  AND phy.name = 'physical reads';

✅ 健康值:OLTP > 90%,DSS(数据仓库)可低至 70%。


7. SGA 调优建议

场景 建议
OLTP 系统 增大 Shared Pool(SQL 复用高),适度 DB Cache
DSS/报表系统 增大 DB Cache(全表扫描多),Shared Pool 可较小
混合负载 启用 SGA_TARGET,让 Oracle 自动调配
内存充足 启用 MEMORY_TARGET(Oracle 11g+)
启用自动 SGA 管理(推荐):
sql 复制代码
-- 关闭手动参数
ALTER SYSTEM RESET shared_pool_size SCOPE = SPFILE SID='*';
ALTER SYSTEM RESET db_cache_size SCOPE = SPFILE SID='*';

-- 设置 SGA_TARGET
ALTER SYSTEM SET sga_target = 2G SCOPE = SPFILE;
-- 重启生效
SHUTDOWN IMMEDIATE;
STARTUP;

🔁 Oracle 会自动在 Shared Pool、DB Cache、Large Pool 之间动态分配内存。


8. 排序区优化(PGA 相关)

8.1 排序区与其他内存区的关系
  • 专用服务器模式(Dedicated Server) :排序内存从 PGA 分配。
  • 共享服务器模式(Shared Server) :排序内存从 UGA(位于 SGA Large Pool) 分配。

✅ Oracle 9i+ 使用 PGA_AGGREGATE_TARGET 统一管理 PGA,不再使用 SORT_AREA_SIZE(已废弃)。

查看 PGA 使用:
sql 复制代码
SELECT * FROM v$pgastat;
-- 关注:aggregate PGA target parameter, total PGA allocated
调整 PGA:
sql 复制代码
-- 设置 PGA 总目标为 1GB
ALTER SYSTEM SET pga_aggregate_target = 1G SCOPE = BOTH;
监控排序活动:
sql 复制代码
-- 查看排序相关统计
SELECT name, value 
FROM v$sysstat 
WHERE name LIKE '%sort%';

-- 关键指标:
-- sorts (memory)    → 内存排序(快)
-- sorts (disk)      → 磁盘排序(慢,应尽量避免)

✅ 健康比例:sorts (disk) / sorts (memory) < 5%


9. 专用模式 vs 共享模式下的排序区调整

模式 内存来源 调优参数
专用模式 PGA PGA_AGGREGATE_TARGET
共享模式 SGA(Large Pool) LARGE_POOL_SIZE
判断当前连接模式:
sql 复制代码
-- 查看是否使用共享服务器
SHOW PARAMETER shared_servers;
-- 若 shared_servers > 0,则部分会话使用共享模式
调整 Large Pool(共享模式):
sql 复制代码
ALTER SYSTEM SET large_pool_size = 256M SCOPE = BOTH;

💡 共享模式下,若 LARGE_POOL_SIZE 不足,UGA 会从 Shared Pool 分配,导致 Shared Pool 碎片。


三、综合性调优案例

场景:OLTP 电商数据库性能下降

症状:
  • 用户反馈"下单慢"
  • AWR 报告显示:高 CPU、大量硬解析、磁盘排序
调优步骤:
步骤 1:检查内存配置
sql 复制代码
-- 当前内存设置
SHOW PARAMETER memory_target;     -- 0(未启用 AMM)
SHOW PARAMETER sga_target;        -- 0(未启用 ASMM)
SHOW PARAMETER pga_aggregate_target; -- 200M(太小!)

-- SGA 手动分配
SHOW PARAMETER shared_pool_size;  -- 128M
SHOW PARAMETER db_cache_size;     -- 512M
步骤 2:启用自动内存管理(假设服务器有 8GB 内存)
sql 复制代码
-- 设置总内存为 4GB(留一半给 OS)
ALTER SYSTEM SET memory_target = 4G SCOPE = SPFILE;
ALTER SYSTEM SET memory_max_target = 4G SCOPE = SPFILE;

-- 重启数据库
SHUTDOWN IMMEDIATE;
STARTUP;
步骤 3:验证自动分配效果
sql 复制代码
-- 查看实际分配
SELECT component, current_size/1024/1024 AS mb 
FROM v$memory_dynamic_components;

-- 输出示例:
-- SHARED POOL     1024 MB
-- DEFAULT BUFFER CACHE  2048 MB
-- PGA TARGET      1024 MB
步骤 4:监控硬解析与排序
sql 复制代码
-- 软解析率(应 >95%)
SELECT 1 - (SUM(reloads)/SUM(pins)) FROM v$librarycache;

-- 排序磁盘比(应 <5%)
SELECT 
  disk.value AS "Disk Sorts",
  mem.value AS "Memory Sorts",
  ROUND(disk.value / NULLIF(mem.value,0) * 100, 2) AS "Disk Sort %"
FROM 
  (SELECT value FROM v$sysstat WHERE name = 'sorts (disk)') disk,
  (SELECT value FROM v$sysstat WHERE name = 'sorts (memory)') mem;
步骤 5:应用层配合(开发建议)
  • 使用 绑定变量 替代字面量,减少硬解析:

    sql 复制代码
    -- ❌ 差:每次都是新 SQL
    SELECT * FROM orders WHERE user_id = 1001;
    SELECT * FROM orders WHERE user_id = 1002;
    
    -- ✅ 好:同一 SQL,不同绑定值
    SELECT * FROM orders WHERE user_id = :user_id;

四、常用诊断脚本汇总

1. 内存总体视图

sql 复制代码
-- SGA + PGA 总览
SELECT 
  'SGA' AS area, SUM(value)/1024/1024 AS mb 
FROM v$sga
UNION ALL
SELECT 
  'PGA', value/1024/1024 
FROM v$pgastat 
WHERE name = 'total PGA allocated';

2. 缓存命中率

sql 复制代码
-- Buffer Cache Hit Ratio
SELECT 
  1 - (phy.value / (cur.value + con.value)) AS hit_ratio
FROM v$sysstat cur, v$sysstat con, v$sysstat phy
WHERE cur.name = 'db block gets'
  AND con.name = 'consistent gets'
  AND phy.name = 'physical reads';

3. 共享池健康度

sql 复制代码
-- Free memory in Shared Pool(应 >10%)
SELECT 
  bytes/1024/1024 AS free_mb,
  (bytes / (SELECT SUM(bytes) FROM v$sgastat WHERE pool='shared pool')) * 100 AS pct_free
FROM v$sgastat 
WHERE pool = 'shared pool' AND name = 'free memory';

五、总结与最佳实践

调优方向 建议
内存管理 优先启用 MEMORY_TARGET(11g+)或 SGA_TARGET + PGA_AGGREGATE_TARGET
Shared Pool 避免硬解析 → 使用绑定变量,监控 v$librarycache
DB Cache 提高命中率 → 增大 db_cache_size 或启用自动管理
PGA/排序 减少磁盘排序 → 增大 pga_aggregate_target
日志缓冲区 OLTP 可适当增大(100--500MB),但收益递减
监控 定期生成 AWR/ASH 报告,关注 Top 5 等待事件

调优不是一次性的:需结合业务增长、数据量变化持续监控与调整。


✅ 本章覆盖 Oracle SGA/PGA 内存结构、关键参数、监控方法及实战调优流程,适用于 DBA 日常性能优化工作。

相关推荐
wei_shuo2 小时前
金仓数据库 KingbaseES:多模融合架构引领,一库全替代构筑数字化转型底座
数据库·金仓数据库
程序员敲代码吗2 小时前
使用Plotly创建交互式图表
jvm·数据库·python
??(lxy)2 小时前
GIT使用学习
git·学习
悟能不能悟2 小时前
oracle中dd/mm/yyyy和dd/mm/rrrrr有什么不一样
数据库·oracle
im_AMBER2 小时前
Leetcode 108 交换链表中的节点
数据结构·笔记·学习·算法·leetcode·链表
椰子今天很可爱2 小时前
Redis基础知识介绍
数据库·redis·缓存
再卷还是菜2 小时前
网安渗透学习小结--sql注入
数据库·sql·学习
LaoZhangGong1232 小时前
学习TCP/IP的第8步:紧急数据
网络·stm32·单片机·学习·tcp/ip·以太网
陌上丨2 小时前
Redis常用的数据类型有哪些?Zset的底层数据结构是什么?
数据结构·数据库·redis