
Oracle 19c: V$AW_CALC 动态性能视图详解
核心作用:监控自动工作负载仓库(AWR)的计算操作,提供AWR报告生成、基线计算等操作的执行详情和性能指标。
1. 视图核心作用
- 计算监控:跟踪AWR报告生成、基线计算等操作的执行状态
- 性能分析:测量计算操作的资源消耗和执行时间
- 进度跟踪:实时显示长时间计算操作的完成进度
- 故障诊断:识别计算失败的原因
- 资源规划:评估AWR计算对系统的影响
📌 注意:此视图仅在AWR计算操作(如报告生成、基线计算)执行时产生数据,日常查询通常为空。
2. 关键使用场景
- 报告生成监控:跟踪AWR/ADDM报告生成进度
- 基线计算优化:分析性能基线计算效率
- 故障排查:诊断报告生成失败问题
- 资源调优:识别高消耗的计算操作
- 自动化管理:脚本化监控AWR计算任务
- 安全审计:验证计算操作的完整性
3. 字段详解 (Oracle 19c)
| 字段名 | 数据类型 | 说明 |
|---|---|---|
CALC_ID | NUMBER | 计算操作唯一ID |
OPERATION_TYPE | VARCHAR2(30) | 操作类型:AWR_REPORT/ADDM_REPORT/BASELINE/METRIC_CALC |
START_TIME | TIMESTAMP | 计算开始时间 |
END_TIME | TIMESTAMP | 计算结束时间(NULL表示进行中) |
ELAPSED_TIME | NUMBER | 已耗时(秒) |
PROGRESS | NUMBER | 完成百分比(0-100) |
STATUS | VARCHAR2(15) | 计算状态:RUNNING/COMPLETED/FAILED/CANCELLED |
DBID | NUMBER | 数据库标识符 |
INSTANCE_NUMBER | NUMBER | 实例编号 |
PARAMETERS | VARCHAR2(4000) | 计算参数(JSON格式) |
CPU_USED | NUMBER | CPU消耗(厘秒) |
MEMORY_USED | NUMBER | 内存使用(字节) |
RESULT_SIZE | NUMBER | 结果大小(字节) |
ERROR_CODE | NUMBER | 错误代码(如ORA-错误) |
ERROR_MESSAGE | VARCHAR2(4000) | 错误详细信息 |
4. 相关视图与基表
关联视图
GV$AW_CALC:集群所有实例的计算操作DBA_HIST_SNAPSHOT:AWR快照元数据V$SESSION_LONGOPS:长时间操作进度V$ACTIVE_SESSION_HISTORY:计算期间的会话活动DBA_HIST_BASELINE:性能基线信息
底层基表
X$KEWMCALC:AWR计算操作内存结构WRH$_CALC_OPERATION:AWR计算历史存储表SELECT * FROM WRH$_CALC_OPERATION WHERE calc_id = 12345;
5. 核心原理
计算操作流程
计算类型详解
| 操作类型 | 描述 |
|---|---|
AWR_REPORT | 生成HTML/TEXT格式的AWR报告 |
ADDM_REPORT | 生成自动数据库诊断监控报告 |
BASELINE | 计算性能基线(移动窗口基线等) |
METRIC_CALC | 计算衍生性能指标(如平均活动会话预测) |
COMPARE_REPORT | 生成AWR比较报告 |
资源管理机制
- 内存分配:使用PGA内存进行数据排序和聚合
- 并行处理:对大型数据集启用并行查询
- 中断恢复:支持操作暂停/恢复(
DBMS_WORKLOAD_REPOSITORY.INTERRUPT_CALCULATION) - 资源限制:受
PGA_AGGREGATE_TARGET和SGA_TARGET约束
6. 常用操作SQL
查看运行中的计算操作
SELECT
calc_id,
operation_type,
ROUND(elapsed_time) AS sec,
progress || '%' AS progress,
TO_CHAR(start_time, 'YYYY-MM-DD HH24:MI:SS') AS start_time
FROM V$AW_CALC
WHERE status = 'RUNNING';
监控报告生成进度
SELECT
calc_id,
operation_type,
progress,
ROUND(elapsed_time) AS sec,
ROUND(memory_used/1024/1024) AS mem_mb
FROM V$AW_CALC
WHERE operation_type = 'AWR_REPORT'
AND status = 'RUNNING';
分析失败的计算操作
SELECT
calc_id,
operation_type,
error_code,
error_message,
TO_CHAR(start_time, 'YYYY-MM-DD HH24:MI') AS start_time
FROM V$AW_CALC
WHERE status = 'FAILED'
AND start_time > SYSDATE - 1;
关联快照信息
SELECT
c.calc_id,
c.operation_type,
s.snap_id,
s.begin_interval_time,
s.end_interval_time
FROM V$AW_CALC c
JOIN DBA_HIST_SNAPSHOT s
ON c.dbid = s.dbid
AND JSON_VALUE(c.parameters, '$.start_snap') = s.snap_id
WHERE c.operation_type = 'AWR_REPORT';
检查高资源消耗操作
SELECT
operation_type,
COUNT(*) AS total_ops,
AVG(elapsed_time) AS avg_sec,
MAX(cpu_used/100) AS max_cpu_sec,
MAX(memory_used/1024/1024) AS max_mem_mb
FROM V$AW_CALC
GROUP BY operation_type
ORDER BY MAX(elapsed_time) DESC;
取消长时间运行操作
-- 获取运行超时的计算ID
SELECT calc_id
FROM V$AW_CALC
WHERE status = 'RUNNING'
AND elapsed_time > 600; -- >10分钟
-- 取消计算
BEGIN
DBMS_WORKLOAD_REPOSITORY.INTERRUPT_CALCULATION(calc_id => 12345);
END;
生成历史性能分析
SELECT
operation_type,
TRUNC(start_time) AS day,
AVG(elapsed_time) AS avg_time,
PERCENTILE_CONT(0.95) WITHIN GROUP (ORDER BY elapsed_time) AS p95_time
FROM V$AW_CALC
WHERE status = 'COMPLETED'
GROUP BY operation_type, TRUNC(start_time)
ORDER BY day DESC;
注意事项
-
数据生命周期:
- 活动计算数据在内存中维护
- 历史数据存储在
WRH$_CALC_OPERATION(保留期同AWR快照) - 实例重启后活动计算记录丢失
-
性能影响:
- 大型报告生成可能消耗大量CPU和内存
- 高峰期间避免执行多个计算操作:
SELECT COUNT(*) FROM V$AW_CALC WHERE status = 'RUNNING';
-
RAC环境:
- 计算在请求发起的实例执行
- 使用
GV$AW_CALC查看集群范围操作 - 跨实例报告需要全局协调
-
参数说明:
/* 典型PARAMETERS值示例 */ { "report_type": "html", "start_snap": 12345, "end_snap": 12346, "dbid": 1234567890, "baseline_name": "PEAK_HOURS" } -
最佳实践:
- 限制报告时间范围:
EXEC DBMS_WORKLOAD_REPOSITORY.CREATE_AWR_REPORT(..., num_days=>1); - 安排非高峰执行:
BEGIN DBMS_SCHEDULER.CREATE_JOB( job_name => 'NIGHTLY_AWR', job_type => 'PLSQL_BLOCK', job_action => 'BEGIN DBMS_WORKLOAD_REPOSITORY.CREATE_AWR_REPORT(...); END;', start_date => TRUNC(SYSDATE)+22/24, -- 晚上10点 repeat_interval => 'FREQ=DAILY' ); END;
- 限制报告时间范围:
-
错误处理:
-- 常见错误及处理 SELECT error_code, COUNT(*) AS occurances, MAX(error_message) AS sample_error FROM V$AW_CALC WHERE status = 'FAILED' GROUP BY error_code;错误代码 原因 解决方案 ORA-01555 快照过期 增加UNDO保留时间 ORA-04030 内存不足 增加PGA_AGGREGATE_TARGET ORA-20000 无效参数 验证输入参数
💡 诊断技巧:
- 实时监控长时间操作:
SELECT s.sid, s.serial#, c.progress, s.event FROM V$SESSION s JOIN V$AW_CALC c ON s.module = 'AWR: '||c.calc_id WHERE c.status = 'RUNNING';- 优化报告性能:
EXEC DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS(topnsql=>'MAXIMUM');
通过V$AW_CALC,DBA可以全面掌握AWR计算操作的执行状态和性能特征,确保数据库性能诊断基础设施的高效运行。
欢迎关注我的公众号《IT小Chen》
1490

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



