
好的,我们来对 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. 使用场景
-
PGA 内存配置调优:
- 评估
PGA_AGGREGATE_TARGET初始化参数的设置是否足够。通过cache hit percentage等统计信息来判断。 - 决定是否应该从手动内存管理 (
WORKAREA_SIZE_POLICY = MANUAL) 切换到自动内存管理 (WORKAREA_SIZE_POLICY = AUTO)。
- 评估
-
性能问题诊断:
- 识别是否存在大量耗时的磁盘排序(
multi-pass executions)或哈希操作,这些通常是PGA内存不足的典型症状。 - 判断系统是否受限于PGA内存分配(
total PGA allocated接近PGA_AGGREGATE_TARGET)。
- 识别是否存在大量耗时的磁盘排序(
-
容量规划与监控:
- 监控实例运行期间PGA使用的峰值和平均值,为服务器内存规划提供数据支持。
- 生成AWR/Statspack报告时,其中的PGA统计信息主要来源于此视图。
-
了解工作负载特征:
- 通过统计信息了解数据库负载是优化模式(大部分操作在内存中完成)还是单次/多道模式(需要与磁盘进行大量交换)。
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内存量(字节)。allocated 和 inuse 的差值代表已分配但当前空闲的内存。 |
| | 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 BY、GROUP BY、DISTINCT、创建索引、位图索引操作)会分配大型工作区,是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内存配置所需的一切关键汇总信息。通过它,可以:
- 宏观把握:快速了解实例PGA的总体分配和使用情况。
- 性能诊断:通过缓存命中率和额外读写字节数等指标,精准判断PGA是否已成为性能瓶颈。
- 调优指导:为设置合理的
PGA_AGGREGATE_TARGET参数提供直接的数据支持,避免内存过度分配或分配不足。 - 容量规划:根据最大分配PGA历史数据,为未来的硬件扩容提供依据。
熟练掌握此视图是进行数据库性能优化,特别是应对排序、哈希连接等内存密集型操作性能问题的必备技能。
欢迎关注我的公众号《IT小Chen》
929

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



