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

在这里插入图片描述

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_IDNUMBER等待类别的唯一标识符(在不同版本中保持一致)
WAIT_CLASSVARCHAR2(64)等待类别的名称(如:User I/O, System I/O, Concurrency, Commit等)
TOTAL_WAITSNUMBER自实例启动以来该等待类别发生的总等待次数
TOTAL_TIMEOUTSNUMBER自实例启动以来该等待类别超时的总次数
TIME_WAITEDNUMBER自实例启动以来该等待类别的总等待时间(单位:百分之一秒)
AVERAGE_WAITNUMBER该等待类别的平均等待时间(单位:百分之一秒)
TIME_WAITED_MICRONUMBER自实例启动以来该等待类别的总等待时间(单位:微秒)
CON_IDNUMBER容器ID(在多租户环境中)

关键字段解读

  • WAIT_CLASS:这是最重要的字段,表示等待类别。常见值包括:
    • User I/O:用户I/O操作相关的等待
    • System I/O:系统I/O操作相关的等待
    • Concurrency:并发相关的等待(如锁争用)
    • Commit:提交操作相关的等待
    • Configuration:配置相关的等待
    • Administrative:管理操作相关的等待
    • Network:网络通信相关的等待
    • Idle:空闲等待事件(通常可以忽略)
  • TOTAL_WAITSTIME_WAITED:这两个字段结合使用可以识别最耗时的等待类别。高TIME_WAITED但低TOTAL_WAITS表示每次等待时间很长;高TOTAL_WAITS但低TIME_WAITED表示频繁但短暂的等待。
  • AVERAGE_WAIT:平均等待时间可以帮助识别响应时间问题。

3 底层原理与相关对象

3.1 底层原理

V$SYSTEM_WAIT_CLASS 视图的数据来源于 Oracle 内核的等待事件统计机制:

  1. 等待事件收集

    • Oracle 内核跟踪所有系统级别的等待事件
    • 每个等待事件都被分配到一个特定的等待类别
    • 等待时间和等待次数被实时更新到内存结构中
  2. 数据聚合

    • 等待事件统计数据按等待类别进行聚合
    • 这种聚合在内存中实时进行,提供了类别级别的性能视图
  3. 统计信息存储

    • 聚合后的数据存储在 SGA 的内存结构中
    • 统计信息从实例启动开始累计,不会重置

3.2 相关视图

视图名称描述
V$SYSTEM_EVENT显示详细的系统等待事件统计信息
V$EVENT_NAME提供所有等待事件及其类别的元数据信息
V$SESSION_WAIT_CLASS显示会话级别的等待类别统计信息
DBA_HIST_SYSTEM_WAIT_CLASSAWR 历史数据中的系统等待类别信息

3.3 基表

V$SYSTEM_WAIT_CLASS 基于 Oracle 内部的 X$ 表构建,主要是:

  • X$KSLEC:等待事件类别表
  • X$KSLED:等待事件定义表
  • X$KSLES:等待事件统计表

这些 X$ 表是 Oracle 内部的内存结构,不建议直接查询。

4 主要使用场景

  1. 系统性能快速诊断

    • 快速识别数据库中的主要性能瓶颈类型
    • 确定资源争用最严重的区域
  2. 性能趋势分析

    • 监控不同等待类别的变化趋势
    • 识别性能问题的模式
  3. 容量规划

    • 根据等待类别分析确定资源需求
    • 规划硬件和配置优化
  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 等待类别分析策略

  1. 关注非空闲等待:忽略 ‘Idle’ 类别的等待,专注于有意义的性能问题
  2. 计算百分比:计算每个等待类别占总等待时间的百分比,优先处理占比高的类别
  3. 结合时间维度:不仅看总等待时间,还要看平均等待时间
  4. 关联详细视图:对于问题严重的等待类别,深入查询 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 的等待类别,可以:

  1. 切换到目标 PDB 后查询 V$SYSTEM_WAIT_CLASS
  2. 使用 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 可以:

  1. 快速识别数据库中的主要性能瓶颈类型
  2. 了解资源争用的整体情况
  3. 制定针对性的性能优化策略
  4. 建立性能基线和监控趋势

有效的等待类别分析需要结合其他性能视图和工具,以及对应用程序和数据库架构的深入理解。定期监控和分析等待类别是维护数据库高性能运行的关键实践。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值