面试宝典:介绍下Oracle数据库动态性能视图 V$PGASTAT

在这里插入图片描述
好的,我们来对 Oracle 19C 数据库中的 V$PGASTAT 动态性能视图进行一次全面、深入的解析。这个视图是数据库性能调优,特别是内存配置调优的核心视图之一。


1. 作用与概述

V$PGASTAT 视图的主要作用是提供实例启动以来,程序全局区 (PGA) 的总体统计信息和汇总数据

核心概念:程序全局区 (PGA)
PGA 是一个私有的内存区域,由每个服务器进程(Server Process)独占使用。它用于存储特定于某个进程的数据和控制信息,例如:

  • 排序区 (Sort Area)
  • 哈希区 (Hash Area)
  • 位图合并区 (Bitmap Merge Area)
  • 会话游标和状态信息
  • 堆栈空间

V$PGASTAT 不显示每个进程的详细PGA使用情况(那是 V$PROCESS 视图的作用),而是提供整个实例层面PGA使用的宏观画像,是评估PGA内存配置(如 PGA_AGGREGATE_TARGET)是否合理的关键依据。


2. 使用场景

  1. PGA 内存配置调优

    • 评估 PGA_AGGREGATE_TARGET 初始化参数的设置是否足够。通过 cache hit percentage 等统计信息来判断。
    • 决定是否应该从手动内存管理 (WORKAREA_SIZE_POLICY = MANUAL) 切换到自动内存管理 (WORKAREA_SIZE_POLICY = AUTO)。
  2. 性能问题诊断

    • 识别是否存在大量耗时的磁盘排序multi-pass executions)或哈希操作,这些通常是PGA内存不足的典型症状。
    • 判断系统是否受限于PGA内存分配(total PGA allocated 接近 PGA_AGGREGATE_TARGET)。
  3. 容量规划与监控

    • 监控实例运行期间PGA使用的峰值和平均值,为服务器内存规划提供数据支持。
    • 生成AWR/Statspack报告时,其中的PGA统计信息主要来源于此视图。
  4. 了解工作负载特征

    • 通过统计信息了解数据库负载是优化模式(大部分操作在内存中完成)还是单次/多道模式(需要与磁盘进行大量交换)。

3. 字段含义详解

以下是 V$PGASTAT 视图中各个字段的详细说明,已按逻辑分类以便于理解:

| 类别 | 字段名 | 数据类型 | 含义说明 |
| :— | :— | :— | :— |
| 统计类别 | NAME | VARCHAR2(64) | 统计项目的名称。这是查询时的主要标识。 |
| | VALUE | NUMBER | 统计项目对应的值。其单位取决于具体的统计项(如字节、次数、百分比)。 |
| | UNIT | VARCHAR2(20) | 值的单位。常见单位:bytes, events, percent。 |
| 内存使用概况 | aggregate PGA target parameter | (NAME) | PGA_AGGREGATE_TARGET 初始化参数的值(字节)。表示PGA内存使用的软性目标上限。 |
| | aggregate PGA auto target | (NAME) | Oracle可自动用于工作区(排序/哈希)的内存量(字节)。这是 PGA_AGGREGATE_TARGET 中减去其他固定PGA开销(如会话内存)后剩余的部分。 |
| | global memory bound | (NAME) | Oracle设置的单个工作区(work area)所能使用的最大内存上限(字节)。此值由Oracle自动计算并动态调整。 |
| | total PGA allocated | (NAME) | 当前实例已分配的总PGA内存量(字节)。此值可能短暂超过 PGA_AGGREGATE_TARGET。 |
| | total PGA inuse | (NAME) | 当前正被服务器进程使用的PGA内存量(字节)。allocatedinuse 的差值代表已分配但当前空闲的内存。 |
| | total freeable PGA memory | (NAME) | 当前已分配的可被释放的PGA内存量(字节)。操作系统可以回收这部分内存。 |
| 工作区执行统计 | total PGA used for auto workareas | (NAME) | 当前自动工作区正在使用的PGA内存量。 |
| | maximum PGA allocated | (NAME) | 自实例启动以来,total PGA allocated 达到的最大值(字节)。用于评估PGA峰值需求。 |
| | total PGA used for manual workareas | (NAME) | 当前手动工作区正在使用的PGA内存量(如果使用手动管理)。 |
| | over allocation count | (NAME) | 自实例启动以来,PGA内存分配超过 PGA_AGGREGATE_TARGET 的次数。理想情况下应为0或接近0。 |
| 性能指标 | cache hit percentage | (NAME) | 工作区的缓存命中率百分比。这是最重要的性能指标。计算公式:100% * (ideal number of bytes / actual number of bytes)理想值应高于90%。 |
| | bytes processed | (NAME) | 所有工作区操作处理的总字节数。 |
| | extra bytes read/written | (NAME) | 所有工作区操作中,因内存不足而不得不进行的额外磁盘I/O(读写临时表空间)的字节数。此值高意味着PGA配置不足。 |
| | recompute count (total) | (NAME) | 工作区大小被重新计算的次数。 |


4. 相关视图与基表

  • 相关动态性能视图

    • V$PROCESS:提供每个服务器进程的详细PGA使用情况(PGA_USED_MEM, PGA_ALLOC_MEM, PGA_MAX_MEM)。
    • V$SYSSTAT:包含一些与PGA相关的系统统计信息,如 sorts (memory)sorts (disk)
    • V$SQL_WORKAREA / V$SQL_WORKAREA_ACTIVE:提供SQL操作的工作区详细信息,可用于定位消耗PGA最多的SQL语句。
    • V$PGA_TARGET_ADVICE:基于当前工作负载,预测不同 PGA_AGGREGATE_TARGET 值下的缓存命中率,用于容量规划。
  • 底层基表
    V$PGASTAT 是一个动态性能视图,其数据不直接来源于普通的磁盘基表。它的数据由数据库实例在运行过程中动态收集和汇总,存储在 SGA 的内存结构中。
    这些统计信息由各个服务器进程在分配和使用PGA时更新,并由后台进程(如MMON)定期采样和持久化到AWR仓库中。其底层源自内部的 X$ 表(如 X$KSMPS)。


5. 详细原理与知识点

1. PGA 与 UGA:
在专用服务器模式下,PGA 包含 UGA (User Global Area)。在共享服务器模式下,UGA 位于 SGA 中。V$PGASTAT 统计的是整个PGA区域。

2. 自动 PGA 内存管理 (Automatic PGA Memory Management):
WORKAREA_SIZE_POLICY = AUTO 且设置了 PGA_AGGREGATE_TARGET 时,Oracle 会自动在所有服务器进程之间分配和管理PGA内存。

  • 工作区 (Work Area):用于执行内存密集型操作(排序、哈希、位图)的PGA部分。
  • 全局内存边界 (Global Memory Bound):Oracle 根据当前系统负载动态调整此值,以确保所有工作区的总内存消耗不会导致 PGA_AGGREGATE_TARGET 被过度使用。一个复杂查询可能获得很大的工作区,而许多小查询则获得较小的工作区。

3. 工作区执行模式:
一个操作的工作区大小决定了其执行效率:

  • 最优模式 (Optimal):整个操作完全在内存中完成。这是最理想的模式。
  • 单次模式 (One-pass):操作需要与磁盘交换一次数据。效率尚可。
  • 多道模式 (Multi-pass):操作需要与磁盘交换多次数据。性能极差,是PGA内存严重不足的标志
    cache hit percentage 综合反映了这三种模式的比例。

4. 调整原理:
目标是让绝大多数操作在最优模式下完成。通过调整 PGA_AGGREGATE_TARGET,使得 cache hit percentage 尽可能高(>90%),同时 over allocation count 为0或极少。

5. 特殊操作:
某些操作(如大型哈希连接、ORDER BYGROUP BYDISTINCT、创建索引、位图索引操作)会分配大型工作区,是PGA内存的主要消费者。


6. 常用查询SQL

1. 查看PGA总体使用情况和关键指标(最常用查询):

SELECT ROUND(value / 1024 / 1024, 2) AS Value_MB
FROM v$pgastat
WHERE name IN (
    'aggregate PGA target parameter', 
    'aggregate PGA auto target',
    'total PGA allocated', 
    'total PGA inuse', 
    'maximum PGA allocated'
)
UNION ALL
SELECT value
FROM v$pgastat
WHERE name = 'cache hit percentage';

为了更直观的展示,可以使用DECODE或CASE WHEN将其转换为一行显示:

SELECT 
    ROUND(SUM(CASE name WHEN 'aggregate PGA target parameter' THEN value END) / 1024 / 1024, 2) AS "TARGET(MB)",
    ROUND(SUM(CASE name WHEN 'total PGA allocated' THEN value END) / 1024 / 1024, 2) AS "ALLOCATED(MB)",
    ROUND(SUM(CASE name WHEN 'total PGA inuse' THEN value END) / 1024 / 1024, 2) AS "INUSE(MB)",
    ROUND(SUM(CASE name WHEN 'maximum PGA allocated' THEN value END) / 1024 / 1024, 2) AS "MAX_ALLOC(MB)",
    ROUND(SUM(CASE name WHEN 'aggregate PGA auto target' THEN value END) / 1024 / 1024, 2) AS "AUTO_TARGET(MB)",
    SUM(CASE name WHEN 'cache hit percentage' THEN value END) AS "CACHE_HIT(%)",
    SUM(CASE name WHEN 'over allocation count' THEN value END) AS "OVER_ALLOC_COUNT"
FROM v$pgastat;

2. 检查PGA内存顾问(预测调整效果):

SELECT ROUND(pga_target_for_estimate / 1024 / 1024) AS target_mb,
       estd_pga_cache_hit_percentage,
       estd_overalloc_count
FROM v$pga_target_advice
ORDER BY 1;

3. 查看工作区执行统计(判断性能健康状况):

SELECT name, value, unit
FROM v$pgastat
WHERE name IN (
    'cache hit percentage', 
    'bytes processed', 
    'extra bytes read/written', 
    'over allocation count'
);

4. 查询会话级别的PGA使用情况(定位高消耗进程):

SELECT s.sid, s.username, s.program, 
       ROUND(p.pga_used_mem / 1024 / 1024, 2) AS pga_used_mb,
       ROUND(p.pga_alloc_mem / 1024 / 1024, 2) AS pga_alloc_mb,
       ROUND(p.pga_max_mem / 1024 / 1024, 2) AS pga_max_mb
FROM v$process p, v$session s
WHERE p.addr = s.paddr
ORDER BY p.pga_used_mem DESC;

总结

V$PGASTAT 是 Oracle 数据库 PGA 内存管理的“仪表盘”。它提供了评估和调整实例级PGA内存配置所需的一切关键汇总信息。通过它,可以:

  1. 宏观把握:快速了解实例PGA的总体分配和使用情况。
  2. 性能诊断:通过缓存命中率额外读写字节数等指标,精准判断PGA是否已成为性能瓶颈。
  3. 调优指导:为设置合理的 PGA_AGGREGATE_TARGET 参数提供直接的数据支持,避免内存过度分配或分配不足。
  4. 容量规划:根据最大分配PGA历史数据,为未来的硬件扩容提供依据。

熟练掌握此视图是进行数据库性能优化,特别是应对排序、哈希连接等内存密集型操作性能问题的必备技能。

欢迎关注我的公众号《IT小Chen

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值