
Oracle 19C V$SYSTEM_WAIT_CLASS 动态性能视图详解
1 视图概述与核心作用
V$SYSTEM_WAIT_CLASS 是 Oracle 数据库中一个重要的性能诊断视图,它提供了按等待类别分组的系统级等待事件统计信息。这个视图将具体的等待事件聚合到更高层次的等待类别中,帮助DBA快速识别数据库中的主要性能瓶颈类型。
与 V$SYSTEM_EVENT 不同,V$SYSTEM_WAIT_CLASS 提供的是类别级别的汇总信息,而不是单个等待事件的详细数据。这种聚合视图使得性能分析更加高效,特别是在初步诊断阶段。
2 字段详解
以下是 V$SYSTEM_WAIT_CLASS 视图包含的字段及其详细含义:
| 字段名称 | 数据类型 | 描述 |
|---|---|---|
| WAIT_CLASS# | NUMBER | 等待类别的内部编号标识符 |
| WAIT_CLASS_ID | NUMBER | 等待类别的唯一标识符(在不同版本中保持一致) |
| WAIT_CLASS | VARCHAR2(64) | 等待类别的名称(如:User I/O, System I/O, Concurrency, Commit等) |
| TOTAL_WAITS | NUMBER | 自实例启动以来该等待类别发生的总等待次数 |
| TOTAL_TIMEOUTS | NUMBER | 自实例启动以来该等待类别超时的总次数 |
| TIME_WAITED | NUMBER | 自实例启动以来该等待类别的总等待时间(单位:百分之一秒) |
| AVERAGE_WAIT | NUMBER | 该等待类别的平均等待时间(单位:百分之一秒) |
| TIME_WAITED_MICRO | NUMBER | 自实例启动以来该等待类别的总等待时间(单位:微秒) |
| CON_ID | NUMBER | 容器ID(在多租户环境中) |
关键字段解读:
WAIT_CLASS:这是最重要的字段,表示等待类别。常见值包括:- User I/O:用户I/O操作相关的等待
- System I/O:系统I/O操作相关的等待
- Concurrency:并发相关的等待(如锁争用)
- Commit:提交操作相关的等待
- Configuration:配置相关的等待
- Administrative:管理操作相关的等待
- Network:网络通信相关的等待
- Idle:空闲等待事件(通常可以忽略)
TOTAL_WAITS和TIME_WAITED:这两个字段结合使用可以识别最耗时的等待类别。高TIME_WAITED但低TOTAL_WAITS表示每次等待时间很长;高TOTAL_WAITS但低TIME_WAITED表示频繁但短暂的等待。AVERAGE_WAIT:平均等待时间可以帮助识别响应时间问题。
3 底层原理与相关对象
3.1 底层原理
V$SYSTEM_WAIT_CLASS 视图的数据来源于 Oracle 内核的等待事件统计机制:
-
等待事件收集:
- Oracle 内核跟踪所有系统级别的等待事件
- 每个等待事件都被分配到一个特定的等待类别
- 等待时间和等待次数被实时更新到内存结构中
-
数据聚合:
- 等待事件统计数据按等待类别进行聚合
- 这种聚合在内存中实时进行,提供了类别级别的性能视图
-
统计信息存储:
- 聚合后的数据存储在 SGA 的内存结构中
- 统计信息从实例启动开始累计,不会重置
3.2 相关视图
| 视图名称 | 描述 |
|---|---|
| V$SYSTEM_EVENT | 显示详细的系统等待事件统计信息 |
| V$EVENT_NAME | 提供所有等待事件及其类别的元数据信息 |
| V$SESSION_WAIT_CLASS | 显示会话级别的等待类别统计信息 |
| DBA_HIST_SYSTEM_WAIT_CLASS | AWR 历史数据中的系统等待类别信息 |
3.3 基表
V$SYSTEM_WAIT_CLASS 基于 Oracle 内部的 X$ 表构建,主要是:
- X$KSLEC:等待事件类别表
- X$KSLED:等待事件定义表
- X$KSLES:等待事件统计表
这些 X$ 表是 Oracle 内部的内存结构,不建议直接查询。
4 主要使用场景
-
系统性能快速诊断:
- 快速识别数据库中的主要性能瓶颈类型
- 确定资源争用最严重的区域
-
性能趋势分析:
- 监控不同等待类别的变化趋势
- 识别性能问题的模式
-
容量规划:
- 根据等待类别分析确定资源需求
- 规划硬件和配置优化
-
性能报告:
- 生成高级别的性能摘要报告
- 向非技术人员解释性能问题
5 常用SQL查询示例
5.1 查看所有等待类别的统计信息(排除空闲等待)
SELECT wait_class,
total_waits,
time_waited,
average_wait,
ROUND((time_waited / (SELECT SUM(time_waited)
FROM v$system_wait_class
WHERE wait_class != 'Idle')) * 100, 2) pct_total
FROM v$system_wait_class
WHERE wait_class != 'Idle'
ORDER BY time_waited DESC;
5.2 计算各类等待的平均等待时间
SELECT wait_class,
total_waits,
time_waited,
ROUND(time_waited / DECODE(total_waits, 0, 1, total_waits), 4) avg_wait_time
FROM v$system_wait_class
WHERE wait_class != 'Idle'
ORDER BY avg_wait_time DESC;
5.3 比较两个时间点的等待类别差异
-- 首先创建临时表保存当前状态
CREATE GLOBAL TEMPORARY TABLE wait_class_snapshot AS
SELECT wait_class, total_waits, time_waited
FROM v$system_wait_class;
-- 一段时间后比较差异
SELECT curr.wait_class,
curr.total_waits - snap.total_waits waits_delta,
curr.time_waited - snap.time_waited time_delta
FROM v$system_wait_class curr,
wait_class_snapshot snap
WHERE curr.wait_class = snap.wait_class
AND curr.total_waits > snap.total_waits
ORDER BY time_delta DESC;
-- 清理临时表
TRUNCATE TABLE wait_class_snapshot;
DROP TABLE wait_class_snapshot;
5.4 查看I/O相关等待的详细信息
SELECT wait_class,
total_waits,
time_waited,
average_wait
FROM v$system_wait_class
WHERE wait_class IN ('User I/O', 'System I/O')
ORDER BY time_waited DESC;
6 重要等待类别解读
6.1 关键等待类别分析
| 等待类别 | 描述 | 可能的原因和解决方案 |
|---|---|---|
| User I/O | 用户I/O操作相关的等待 | 缺少索引、全表扫描过多、存储性能不足 |
| Concurrency | 并发相关的等待 | 锁争用、热点块、应用程序逻辑问题 |
| Commit | 提交操作相关的等待 | 日志文件I/O性能问题、过于频繁的提交 |
| Configuration | 配置相关的等待 | 参数设置不当、资源分配不足 |
| System I/O | 系统I/O操作相关的等待 | 数据文件I/O性能问题、存储配置不当 |
6.2 等待类别分析策略
- 关注非空闲等待:忽略 ‘Idle’ 类别的等待,专注于有意义的性能问题
- 计算百分比:计算每个等待类别占总等待时间的百分比,优先处理占比高的类别
- 结合时间维度:不仅看总等待时间,还要看平均等待时间
- 关联详细视图:对于问题严重的等待类别,深入查询
V$SYSTEM_EVENT获取详细信息
7 高级应用与最佳实践
7.1 性能基线建立
建立性能基线是有效性能管理的关键:
-- 创建性能基线表
CREATE TABLE perf_baseline AS
SELECT SYSDATE AS baseline_date,
wait_class,
total_waits,
time_waited
FROM v$system_wait_class;
-- 比较当前状态与基线
SELECT curr.wait_class,
curr.total_waits - base.total_waits waits_growth,
curr.time_waited - base.time_waited time_growth
FROM v$system_wait_class curr,
perf_baseline base
WHERE curr.wait_class = base.wait_class
AND base.baseline_date = (SELECT MAX(baseline_date) FROM perf_baseline)
ORDER BY time_growth DESC;
7.2 多租户环境考虑
在 CDB 环境中,V$SYSTEM_WAIT_CLASS 显示整个 CDB 的等待类别统计。如果需要查看特定 PDB 的等待类别,可以:
- 切换到目标 PDB 后查询
V$SYSTEM_WAIT_CLASS - 使用
CON_ID字段过滤特定容器的数据
-- 查看所有容器的等待类别统计
SELECT con_id, wait_class, total_waits, time_waited
FROM v$system_wait_class
WHERE wait_class != 'Idle'
ORDER BY con_id, time_waited DESC;
7.3 历史数据分析
对于长期性能分析,应该使用 DBA_HIST_SYSTEM_WAIT_CLASS 视图:
SELECT s.snap_id,
s.wait_class,
s.total_waits,
s.time_waited
FROM dba_hist_system_wait_class s,
dba_hist_snapshot sn
WHERE s.snap_id = sn.snap_id
AND s.wait_class = 'User I/O'
AND sn.begin_interval_time > SYSDATE - 7
ORDER BY s.snap_id;
8 总结
V$SYSTEM_WAIT_CLASS 是 Oracle 数据库性能诊断的重要工具,提供了等待事件的类别级别视图。通过这个视图,DBA 可以:
- 快速识别数据库中的主要性能瓶颈类型
- 了解资源争用的整体情况
- 制定针对性的性能优化策略
- 建立性能基线和监控趋势
有效的等待类别分析需要结合其他性能视图和工具,以及对应用程序和数据库架构的深入理解。定期监控和分析等待类别是维护数据库高性能运行的关键实践。
欢迎关注我的公众号《IT小Chen》
1086

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



