
好的,我们来对 Oracle 19C 数据库中的 V$PGA_TARGET_ADVICE_HISTOGRAM 动态性能视图进行一次极其详细和准确的解析。这个视图提供了比 V$PGA_TARGET_ADVICE 更为细粒度的 PGA 内存调优信息。
1. 作用与概述
V$PGA_TARGET_ADVICE_HISTOGRAM 视图的主要作用是通过预测模型,以直方图(Histogram)的形式,模拟在不同大小的 PGA_AGGREGATE_TARGET 值下,不同所需内存量的工作区(Work Area)预计将以何种模式(最优、单次、多道)执行。
核心概念:工作区执行模式预测
V$PGA_TARGET_ADVICE告诉你整体的缓存命中率。V$PGA_TARGET_ADVICE_HISTOGRAM则告诉你,为了实现那个整体命中率,有多少数量的、需要特定内存大小的工作区操作将在哪种模式下运行。
它回答了更细致的问题:“如果将PGA调整到X MB,那么有多少个需要Y MB内存的排序操作可以在内存中完成?” 这帮助你理解性能提升或下降的具体来源。
2. 使用场景
-
深度PGA性能诊断:
当V$PGASTAT显示缓存命中率低时,使用此视图定位是哪些大小范围的工作区(如 1-2MB 的排序还是 10MB+ 的哈希连接)导致了大量的磁盘I/O(单次/多道模式执行)。 -
精细化调优:
确认增加PGA内存的收益。例如,发现将目标值从2GB增加到3GB,主要能让需要2MB-4MB工作区的操作从“单次模式”升级为“最优模式”,从而量化性能提升。 -
容量规划验证:
判断当前或规划的PGA内存是否足以覆盖绝大多数的工作区操作需求。例如,如果系统有大量需要64MB工作区的操作,但建议值下这些操作仍无法在“最优模式”下完成,则说明负载非常沉重。 -
理解工作负载特征:
分析数据库负载的内存需求分布。是大量的小操作,还是少量的大操作?这对于整体资源规划至关重要。
3. 字段含义详解
以下是 V$PGA_TARGET_ADVICE_HISTOGRAM 视图中每个字段的精确说明。所有 ESTD_* 开头的字段都是预测值。
| 字段名 | 数据类型 | 含义说明 |
|---|---|---|
| PGA_TARGET_FOR_ESTIMATE | NUMBER | 用于进行此次预测的模拟PGA聚合目标值(单位:字节)。这是“假设”的目标值。 |
| LOW_OPTIMAL_SIZE | NUMBER | 此直方图桶(bucket)的下限边界(单位:字节)。表示工作区所需的内存大小范围起始值。 |
| HIGH_OPTIMAL_SIZE | NUMBER | 此直方图桶(bucket)的上限边界(单位:字节)。表示工作区所需的内存大小范围结束值。LOW_OPTIMAL_SIZE <= 工作区大小 < HIGH_OPTIMAL_SIZE。 |
| ESTD_OPTIMAL_EXECUTIONS | NUMBER | 在模拟的PGA目标值下,预计落入此内存大小范围的工作区操作中,能够在 最优模式 (Optimal) 下执行的数量。 |
| ESTD_ONEPASS_EXECUTIONS | NUMBER | 在模拟的PGA目标值下,预计落入此内存大小范围的工作区操作中,能够在 单次模式 (One-pass) 下执行的数量。 |
| ESTD_MULTIPASSES_EXECUTIONS | NUMBER | 在模拟的PGA目标值下,预计落入此内存大小范围的工作区操作中,将在 多道模式 (Multi-pass) 下执行的数量。应极力避免此值大于0。 |
| CON_ID | NUMBER | 包含此数据的容器的ID。在CDB环境中,指示该数据属于哪个PDB。 |
4. 相关视图与基表
-
相关动态性能视图:
V$PGA_TARGET_ADVICE:提供汇总的建议信息(总体命中率)。这是本视图的汇总版,两者结合分析效果最佳。V$SQL_WORKAREA_HISTOGRAM:显示当前工作负载下,不同大小工作区在不同执行模式下的实际执行次数。V$PGA_TARGET_ADVICE_HISTOGRAM是其预测版。V$PGASTAT:提供PGA的总体运行统计,是顾问功能进行预测的数据基础。V$SQL_WORKAREA_ACTIVE:查看当前正在执行的、消耗PGA的工作区。
-
底层基表与原理:
V$PGA_TARGET_ADVICE_HISTOGRAM与V$PGA_TARGET_ADVICE共享相同的数据源和预测引擎。- 数据源:其预测基于实例启动后收集在SGA中的工作区执行历史数据(类似于
V$SQL_WORKAREA_HISTOGRAM中的实际数据)。 - 预测模型:Oracle 顾问功能不仅模拟总体内存分配,还会将历史工作负载按工作区所需内存大小进行分桶,然后对每个桶内的操作单独模拟在不同PGA目标值下的执行模式。
- 持久化:同样由MMON进程定期采样至AWR仓库。
- 底层结构:其底层来源于内部的
X$表(如X$KSMMPAH),在查询时动态填充。
- 数据源:其预测基于实例启动后收集在SGA中的工作区执行历史数据(类似于
5. 详细原理与知识点
1. 直方图桶(Histogram Buckets)的含义:
该视图将工作区按它们所需要的最佳内存量(OPTIMAL_SIZE) 划分到不同的桶中。每个桶代表了一个内存范围(例如 2MB-4MB)。这并不是指Oracle分配给它们的内存量,而是指它们为了能在最优模式下运行所需要的内存量。
2. 执行模式(Execution Mode)的优先级:
顾问的预测逻辑是:在给定的模拟PGA目标值下,Oracle会尽可能让工作区在最优模式下运行。如果总内存不足,则会根据一些内部算法(如优先级)决定哪些工作区被降级到单次甚至多道模式。这个视图预测了每个桶内“牺牲”掉的操作数量。
3. 如何解读——“寻找关键桶”:
调优的关键是识别那些“ESTD_ONEPASS_EXECUTIONS”或“ESTD_MULTIPASSES_EXECUTIONS”数值较高的桶。这些桶代表了导致性能问题的主力军。
- 案例:当前PGA目标为2GB,查询发现
LOW_OPTIMAL_SIZE=4MB,HIGH_OPTIMAL_SIZE=8MB这个桶的ESTD_ONEPASS_EXECUTIONS很高。而当PGA目标设为3GB时,这个桶的ESTD_OPTIMAL_EXECUTIONS大幅上升,ESTD_ONEPASS_EXECUTIONS降为0。这说明将PGA从2GB增加到3GB,主要效益是让所有需要4-8MB内存的操作从单次模式提升到了最优模式。
4. 与V$SQL_WORKAREA_HISTOGRAM的关系:
V$SQL_WORKAREA_HISTOGRAM:告诉你已经发生的事情。“过去24小时,有1000个需要2-4MB的操作在单次模式下运行。”V$PGA_TARGET_ADVICE_HISTOGRAM:告诉你可能发生的事情。“如果我把PGA增大到3GB,预计那1000个操作里的90%将来可以在最优模式下运行。”
6. 常用查询SQL
1. 查询特定PGA目标值下的预测明细(例如,当前值的2倍)
SELECT
ROUND(low_optimal_size/1024/1024) AS low_mb,
ROUND(high_optimal_size/1024/1024) AS high_mb,
estd_optimal_executions AS optimal,
estd_onepass_executions AS onepass,
estd_multipasses_executions AS multipass
FROM v$pga_target_advice_histogram
WHERE pga_target_factor = 2 -- 查看当前目标2倍大小的预测
AND estd_total_executions != 0 -- 忽略没有执行的桶
ORDER BY low_mb;
2. 对比不同PGA目标值的预测(当前值 vs 推荐值)
此查询比较当前设置和另一个设置(如3GB)下,各内存区间的执行模式变化。
WITH current_setting AS (
SELECT low_optimal_size, high_optimal_size,
estd_optimal_executions AS curr_optimal,
estd_onepass_executions AS curr_onepass,
estd_multipasses_executions AS curr_multipass
FROM v$pga_target_advice_histogram
WHERE pga_target_factor = 1 -- 当前设置
),
proposed_setting AS (
SELECT low_optimal_size, high_optimal_size,
estd_optimal_executions AS prop_optimal,
estd_onepass_executions AS prop_onepass,
estd_multipasses_executions AS prop_multipass
FROM v$pga_target_advice_histogram
-- 假设通过V$PGA_TARGET_ADVICE找到3GB是个好选择,这里指定绝对字节值
WHERE pga_target_for_estimate = 3 * 1024 * 1024 * 1024
)
SELECT
ROUND(c.low_optimal_size/1024/1024) AS low_mb,
ROUND(c.high_optimal_size/1024/1024) AS high_mb,
c.curr_optimal, c.curr_onepass, c.curr_multipass,
p.prop_optimal, p.prop_onepass, p.prop_multipass,
(p.prop_optimal - c.curr_optimal) AS gain_in_optimal -- 优化模式的增益
FROM current_setting c
JOIN proposed_setting p ON (c.low_optimal_size = p.low_optimal_size AND c.high_optimal_size = p.high_optimal_size)
WHERE c.curr_onepass > 0 OR c.curr_multipass > 0 -- 关注当前有问题的桶
ORDER BY gain_in_optimal DESC;
3. 定位问题最严重的桶(在当前设置下)
SELECT
ROUND(low_optimal_size/1024/1024) AS low_mb,
ROUND(high_optimal_size/1024/1024) AS high_mb,
estd_optimal_executions AS optimal,
estd_onepass_executions AS onepass,
estd_multipasses_executions AS multipass,
(estd_onepass_executions + estd_multipasses_executions) AS total_suboptimal
FROM v$pga_target_advice_histogram
WHERE pga_target_factor = 1 -- 当前设置
AND (estd_onepass_executions > 0 OR estd_multipasses_executions > 0)
ORDER BY total_suboptimal DESC, low_optimal_size;
总结
V$PGA_TARGET_ADVICE_HISTOGRAM 是 Oracle 提供的 PGA 内存调优的“显微镜”。它将整体的性能建议分解到不同粒度的工作区级别,使你能够:
- 精准定位:确切知道是哪些大小的工作区操作在“拖后腿”,导致性能下降。
- 量化收益:清晰地量化调整PGA内存大小所带来的具体性能收益,使调优决策更有说服力。
- 深度洞察:深入了解数据库工作负载的内存需求分布特征。
对于追求极致性能和数据驱动的DBA来说,在使用了 V$PGA_TARGET_ADVICE 进行宏观决策后,使用本视图进行微观分析,是彻底解决PGA相关性能问题的标准流程。
欢迎关注我的公众号《IT小Chen》
1190

被折叠的 条评论
为什么被折叠?



