本人好课列表: 39138/ 精通Oracle 19c DataGuard系列之实施篇-核心配置:复制生成物理备库 https://edu.51cto.com/course/39138.html
39070/ 精通Oracle 19c DataGuard系列之实施篇-核心配置:手搓物理备库部署 https://edu.51cto.com/course/39070.html
39069/ 精通Oracle 19c DataGuard系列之一基础知识篇 https://edu.51cto.com/course/39069.html
8917/ 数据库迁移实战课程:解决迁移 “最后一公里” 难题 https://edu.51cto.com/course/38917.html
38460/ DeepSeek AI 助手实战宝典:从入门到精通的高效工作流 https://edu.51cto.com/course/38460.html
8327/ Oracle 19C TB级安装/管理数据库生产环境实战 https://edu.51cto.com/course/38327.html
39245/ dataguard CDB模式实战部署 https://edu.51cto.com/course/39245.html
Oracle 19c 中的 V$SGA_TARGET_ADVICE
视图提供关于调整 SGA_TARGET
参数的优化建议,帮助DBA评估不同SGA大小对数据库性能的影响。以下是详细用法指南:
核心作用
预测不同 SGA_TARGET
值对以下指标的影响:
- 物理读操作(
ESTD_PHYSICAL_READS
) - 数据库时间(
ESTD_DB_TIME
) - 内存组件分配(如Buffer Cache、Shared Pool等)
关键字段说明
列名 | 描述 |
| SGA总大小(MB),包括当前值及模拟值。 |
| 相对于当前 |
| 预估的数据库时间(秒)。值越低性能越好。 |
| 预估数据库时间与当前值的比率( |
| 预估的物理读次数。值越低说明I/O压力越小。 |
使用场景
- 评估SGA扩容效果 查询不同SGA大小下物理读和响应时间的变化,确定最佳内存分配。
- 诊断性能瓶颈 若增大SGA后物理读显著下降,说明当前SGA不足导致I/O过高。
- 资源规划 为服务器内存扩容提供数据支持。
查询示例
1. 基础建议查询
SELECT sga_size,
ROUND(sga_size_factor, 2) AS size_factor,
estd_db_time,
ROUND(estd_db_time_factor, 2) AS time_factor,
estd_physical_reads
FROM v$sga_target_advice
ORDER BY sga_size;
2. 分析性能提升点
SELECT
sga_size AS "SGA Size (MB)",
estd_physical_reads AS "Estimated Physical Reads",
ROUND((estd_physical_reads - LAG(estd_physical_reads) OVER (ORDER BY sga_size)) / 1000, 2) AS "Reduction in Reads (K)",
ROUND((1 - estd_db_time / FIRST_VALUE(estd_db_time) OVER (ORDER BY sga_size)) * 100, 2) AS "% DB Time Improvement"
FROM v$sga_target_advice;
结果解读
- 性能拐点:当增大SGA后
ESTD_PHYSICAL_READS
下降不明显时,说明已接近最优值。 - 关键指标:
ESTD_DB_TIME_FACTOR < 1
:性能提升ESTD_DB_TIME_FACTOR > 1
:性能下降
- 示例输出:
SGA_SIZE | SIZE_FACTOR | ESTD_DB_TIME | TIME_FACTOR | ESTD_PHYSICAL_READS
--------------------------------------------------------------
4000 | 0.5 | 1200 | 1.20 | 500000
8000 | 1.0 | 1000 | 1.00 | 300000 <-- 当前值
12000 | 1.5 | 950 | 0.95 | 250000
16000 | 2.0 | 940 | 0.94 | 245000
分析:
- 从
8000MB
→12000MB
:物理读减少5万,DB时间下降5%。 - 从
12000MB
→16000MB
:性能提升微弱,说明12000MB
接近最优值。
详细数据和性能分析趋势
SELECT
sga_size / 1024 AS "SGA Size (GB)", -- 转换为GB更易读
ROUND(sga_size_factor, 2) AS "Size Factor",
estd_db_time AS "Estimated DB Time (sec)",
ROUND(estd_db_time_factor, 2) AS "Time Factor",
estd_physical_reads / 1000 AS "Physical Reads (K)",
ROUND((LEAD(estd_physical_reads) OVER (ORDER BY sga_size) - estd_physical_reads) / 1000, 1) AS "Read Reduction per GB (K)",
CASE
WHEN sga_size = (SELECT value FROM v$parameter WHERE name = 'sga_target')
THEN '<< CURRENT VALUE'
WHEN estd_db_time_factor <= 0.9
THEN '*** HIGH IMPACT ***'
WHEN estd_db_time_factor <= 0.95
THEN '** MEDIUM IMPACT **'
ELSE NULL
END AS "Recommendation"
FROM v$sga_target_advice
ORDER BY sga_size;
输出结果 (模拟真实场景):
SGA Size (GB) | Size Factor | Estimated DB Time (sec) | Time Factor | Physical Reads (K) | Read Reduction per GB (K) | Recommendation |
4.0 | 0.50 | 3200 | 1.60 | 1850 | -420.0 | |
6.0 | 0.75 | 2450 | 1.23 | 1430 | -310.0 | |
8.0 | 1.00 | 2000 | 1.00 | 1120 | -180.0 | << CURRENT VALUE |
10.0 | 1.25 | 1760 | 0.88 | 940 | -90.0 | ** MEDIUM IMPACT ** |
12.0 | 1.50 | 1650 | 0.83 | 850 | -45.0 | *** HIGH IMPACT *** |
14.0 | 1.75 | 1610 | 0.81 | 805 | -22.5 | |
16.0 | 2.00 | 1600 | 0.80 | 782 | NULL |
深度性能分析
- 当前配置 (8GB)
- 物理读:1,120K
- 数据库时间:2000秒
- 扩容到 10GB (+25%)
- 物理读减少:180K
- 数据库时间减少:240秒
- 每GB收益:90K读减少 / 120秒时间节省
- 扩容到 12GB (+50%)
- 物理读减少:270K
- 数据库时间减少:350秒
- 性能拐点:超过12GB后收益急剧下降
- 扩容到 16GB (+100%)
- 物理读仅减少:338K
- 数据库时间减少:400秒
- 边际效应:最后4GB仅减少68K读/50秒时间
关键结论
- 最优性价比区间:10GB - 12GB
- 时间因子从0.88→0.83,性能提升显著
- 每GB可获得45K读减少 / 55秒时间节省
- 扩容建议:
-- 推荐调整到12GB (比当前值高50%)
ALTER SYSTEM SET sga_target=12G SCOPE=BOTH;
预期效果:
- 物理读减少24%
- 数据库时间减少17.5%
- 警告:
- 超过14GB后,每GB内存仅减少<10K物理读,ROI过低
- 若服务器内存不足,建议优先分配12GB而非16GB
性能优化图谱
物理读减少趋势 (单位:千次)
2000 ┼
│
1600 ┼ ██
│ ██ ██
1200 ┼ ██ ██ << 当前值 (1120K)
│ ██ ██
800 ┼ ██ ██████ << 最优区间 (850K)
│ ██ ██
400 ┼█ █
┼──┼──┼──┼──┼──┼──┼──┼──┼──▶
4 6 8 10 12 14 16 SGA(GB)
性能提升关键区域:10-12GB (斜率最陡峭)
📌 行动指南:
- 立即扩容到12GB
- 监控
V$SGA_RESIZE_OPS
验证内存重组 - 24小时后重新检查
AWR
报告的物理读变化
注意事项
- 数据来源: 建议基于AWR自动工作负载仓库的历史统计,确保数据库已运行典型负载。
- 动态调整:
修改
SGA_TARGET
后,Oracle需重新收集统计信息(通常等待1-2小时)。 - 局限性: 仅预测物理读影响,不涵盖CPU或网络等其他因素。
操作步骤
- 确认自动内存管理已启用:
SHOW PARAMETER memory_target; -- 应为0
SHOW PARAMETER sga_target; -- 非0值表示启用
- 收集负载统计:
EXEC DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT();
- 运行查询并分析
V$SGA_TARGET_ADVICE
。 - 按需调整SGA:
ALTER SYSTEM SET sga_target = 12000M SCOPE=BOTH;
通过合理利用此视图,可显著优化Oracle内存配置,降低I/O压力,提升数据库性能。