
Oracle 19C V$SYSTEM_EVENT 动态性能视图详解
1 视图概述与核心作用
V$SYSTEM_EVENT 是 Oracle 数据库中最关键的性能诊断视图之一,它提供了自数据库实例启动以来所有系统级等待事件的累计统计信息。等待事件是 Oracle 性能调优的核心概念,当会话需要等待某些资源或操作完成时(如I/O操作、锁获取、网络传输等),就会记录相应的等待事件。
这个视图的主要作用是帮助DBA:
- 识别数据库中的主要性能瓶颈和资源争用点
- 了解系统级别的等待事件分布情况
- 进行性能基准比较和趋势分析
- 诊断数据库整体性能问题
2 字段详解
以下是 V$SYSTEM_EVENT 视图包含的字段及其详细含义:
| 字段名称 | 数据类型 | 描述 |
|---|---|---|
| EVENT# | NUMBER | 等待事件的内部编号标识符 |
| EVENT | VARCHAR2(64) | 等待事件的名称(如:db file sequential read, log file sync, enq: TX - row lock contention) |
| TOTAL_WAITS | NUMBER | 自实例启动以来该等待事件发生的总次数 |
| TOTAL_TIMEOUTS | NUMBER | 自实例启动以来该等待事件超时的总次数 |
| TIME_WAITED | NUMBER | 自实例启动以来该等待事件的总等待时间(单位:百分之一秒) |
| AVERAGE_WAIT | NUMBER | 该等待事件的平均等待时间(单位:百分之一秒) |
| TIME_WAITED_MICRO | NUMBER | 自实例启动以来该等待事件的总等待时间(单位:微秒) |
| EVENT_ID | NUMBER | 等待事件的稳定标识符(在不同版本中保持一致) |
| WAIT_CLASS_ID | NUMBER | 等待事件类别的编号标识符 |
| WAIT_CLASS# | NUMBER | 等待事件类别的编号 |
| WAIT_CLASS | VARCHAR2(64) | 等待事件所属的类别名称(如:User I/O, System I/O, Concurrency, Commit等) |
| CON_ID | NUMBER | 容器ID(在多租户环境中) |
3 底层原理与相关对象
3.1 底层原理
V$SYSTEM_EVENT 视图的数据来源于 Oracle 内核的等待事件统计机制:
-
等待事件收集机制:
- 当数据库进程需要等待某个资源或操作时,会进入等待状态
- Oracle 内核会记录等待开始时间和结束时间
- 等待完成后,相应的等待事件统计信息会被更新
-
统计信息存储:
- 等待事件统计信息存储在 SGA 的固定内存结构中
- 每个等待事件都有独立的计数器记录等待次数和等待时间
- 统计信息从实例启动开始累计,不会重置
-
数据持久化:
- 虽然
V$SYSTEM_EVENT本身是易失的,但 AWR 快照会定期捕获这些数据并保存到DBA_HIST_SYSTEM_EVENT - Statspack 快照也会捕获等待事件统计信息
- 虽然
3.2 相关视图
| 视图名称 | 描述 |
|---|---|
| V$SESSION_EVENT | 显示会话级别的等待事件统计信息 |
| V$EVENT_NAME | 提供所有等待事件的元数据信息 |
| V$SYSTEM_WAIT_CLASS | 按等待类别汇总的等待事件统计信息 |
| DBA_HIST_SYSTEM_EVENT | AWR 历史数据中的系统等待事件信息 |
| V$ACTIVE_SESSION_HISTORY | 提供活动会话的历史等待信息 |
3.3 基表
V$SYSTEM_EVENT 基于 Oracle 内部的 X$ 表构建,主要是:
- X$KSLED:等待事件定义表
- X$KSLES:等待事件统计表
这些 X$ 表是 Oracle 内部的内存结构,不建议直接查询。
4 主要使用场景
-
系统性能诊断:
- 识别数据库中的主要性能瓶颈
- 确定资源争用最严重的区域
-
性能基准分析:
- 建立性能基准,用于后续比较
- 监控性能趋势和变化
-
容量规划:
- 根据等待事件分析确定资源需求
- 规划硬件和配置优化
-
故障排查:
- 诊断突发的性能问题
- 识别异常等待模式
5 常用SQL查询示例
5.1 查看Top等待事件(按等待时间排序)
SELECT event,
total_waits,
time_waited,
average_wait,
ROUND((time_waited / (SELECT SUM(time_waited)
FROM v$system_event
WHERE wait_class != 'Idle')) * 100, 2) pct_total
FROM v$system_event
WHERE wait_class != 'Idle'
ORDER BY time_waited DESC;
5.2 按等待类别分析等待时间分布
SELECT wait_class,
SUM(total_waits) total_waits,
SUM(time_waited) time_waited,
ROUND(SUM(time_waited) / (SELECT SUM(time_waited)
FROM v$system_event
WHERE wait_class != 'Idle') * 100, 2) pct_total
FROM v$system_event
WHERE wait_class != 'Idle'
GROUP BY wait_class
ORDER BY time_waited DESC;
5.3 比较两个时间点的等待事件差异
-- 首先创建临时表保存当前状态
CREATE GLOBAL TEMPORARY TABLE system_event_snapshot AS
SELECT event, total_waits, time_waited
FROM v$system_event;
-- 一段时间后比较差异
SELECT curr.event,
curr.total_waits - snap.total_waits waits_delta,
curr.time_waited - snap.time_waited time_delta
FROM v$system_event curr,
system_event_snapshot snap
WHERE curr.event = snap.event
AND curr.total_waits > snap.total_waits
ORDER BY time_delta DESC;
-- 清理临时表
TRUNCATE TABLE system_event_snapshot;
DROP TABLE system_event_snapshot;
5.4 计算各类等待的平均等待时间
SELECT wait_class,
SUM(total_waits) total_waits,
SUM(time_waited) total_time,
ROUND(SUM(time_waited) / DECODE(SUM(total_waits), 0, 1, SUM(total_waits)), 4) avg_wait_time
FROM v$system_event
WHERE wait_class != 'Idle'
GROUP BY wait_class
ORDER BY avg_wait_time DESC;
6 重要等待事件解读
6.1 常见关键等待事件
| 等待事件 | 等待类别 | 描述和可能的原因 |
|---|---|---|
| db file sequential read | User I/O | 通常表示索引读取或单块读取,高等待可能表明缺少索引或全表扫描过多 |
| db file scattered read | User I/O | 通常表示全表扫描或多块读取,高等待可能表明需要优化SQL或增加缓冲区缓存 |
| log file sync | Commit | 提交操作等待日志写入完成,高等待可能表明日志文件I/O性能问题 |
| enq: TX - row lock contention | Concurrency | 行级锁争用,通常由应用程序逻辑引起 |
| buffer busy waits | Concurrency | 缓冲区忙等待,多个进程试图同时访问相同的数据块 |
| free buffer waits | Configuration | 等待空闲缓冲区,可能表明需要增加缓冲区缓存大小或检查写入性能 |
6.2 等待事件分析策略
- 关注非空闲等待:忽略 ‘Idle’ 类别的等待事件,因为它们通常表示正常的空闲状态
- 计算百分比:计算每个等待事件占总等待时间的百分比,优先处理占比高的等待
- 结合时间维度:不仅看总等待时间,还要看平均等待时间,高平均等待时间可能表示严重瓶颈
- 关联其他视图:将等待事件与
V$SQL、V$SESSION等视图关联,找到具体的SQL和会话
7 高级应用与注意事项
7.1 等待事件与性能调优
-
I/O相关等待:
- 优化SQL语句,减少物理I/O
- 考虑使用更快的存储系统
- 调整数据库缓冲区缓存大小
-
锁争用等待:
- 优化应用程序逻辑,减少锁持有时间
- 使用SELECT FOR UPDATE NOWAIT避免阻塞
- 考虑使用乐观锁机制
-
日志相关等待:
- 将日志文件放在高速磁盘上
- 考虑使用日志缓冲区调整
- 避免过于频繁的提交操作
7.2 多租户环境考虑
在CDB环境中,V$SYSTEM_EVENT 显示整个CDB的等待事件统计。如果需要查看特定PDB的等待事件,可以:
- 切换到目标PDB后查询
V$SYSTEM_EVENT - 使用
CON_ID字段过滤特定容器的数据
7.3 历史数据分析
对于长期性能分析,应该使用 DBA_HIST_SYSTEM_EVENT 视图:
SELECT snap_id, event, total_waits, time_waited
FROM dba_hist_system_event
WHERE event = 'db file sequential read'
ORDER BY snap_id;
8 总结
V$SYSTEM_EVENT 是 Oracle 数据库性能诊断的核心工具,提供了系统级别等待事件的全面视图。通过分析这个视图,DBA可以:
- 识别数据库中的主要性能瓶颈
- 了解资源争用情况
- 制定针对性的性能优化策略
- 建立性能基准和监控趋势
有效的等待事件分析需要结合其他性能视图和工具,以及对应用程序和数据库架构的深入理解。定期监控和分析等待事件是维护数据库高性能运行的关键实践。
欢迎关注我的公众号《IT小Chen》
Oracle V$SYSTEM_EVENT详解与调优应用
1085

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



