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

在这里插入图片描述

V$SESSION_WAIT

是 Oracle 数据库中一个非常关键的性能诊断视图,它揭示了所有会话当前或最后一次的等待事件信息,帮助你快速定位数据库瓶颈。在 Oracle 19c 中,虽然部分 VSESSIONWAIT的功能已整合到‘VSESSION_WAIT 的功能已整合到 `VSESSIONWAIT的功能已整合到VSESSION` 中,但它仍然是分析并发等待问题的利器。

下面是这个视图主要字段的含义,帮你快速理解其内容:

字段名数据类型描述补充说明/示例
SIDNUMBER会话标识符 (Session Identifier)对应于 V$SESSION.SID
EVENTVARCHAR2(64)会话当前正在等待的资源或事件名称。如果会话处于空闲状态,则显示最后一次非空闲等待事件。例如:'db file sequential read' (索引扫描等待), 'buffer busy waits' (缓冲块争用), 'enq: TX - row lock contention' (行锁等待)
WAIT_TIMENUMBER最后一次等待的持续时间(单位:百分之一秒)。它的含义需结合 STATE 解读:>0: 最后一次等待的持续时间(单位:10ms)。
0: 会话正在等待当前事件。
-1: 最后一次等待时间 < 1/100 秒。
-2: 时间统计功能未开启(TIMED_STATISTICS=false)。
SEQ#NUMBER等待事件的序列号。每次会话开始一个新的等待,此值便会递增。用于区分同一会话发生的多次等待事件的顺序。
P1, P2, P3NUMBER等待事件的附加参数,其具体含义完全由 EVENT 字段决定。例如,对于 'buffer busy waits'
P1: 文件号
P2: 块号
P3: 争用原因码
P1TEXT, P2TEXT, P3TEXTVARCHAR2(64)分别对应 P1, P2, P3 参数的文本描述。例如,P1TEXT 可能是 'file#', P2TEXT 可能是 'block#'
STATEVARCHAR2(19)等待状态:
WAITING: 会话正在等待。
WAITED UNKNOWN TIME: 发生等待但时间未知(TIMED_STATISTICS=false)。
WAITED SHORT TIME: 最后一次等待时间极短(<1统计单位)。
WAITED KNOWN TIME: 会话曾等待并已获得资源。
此字段是对 WAIT_TIME 含义的总结和解释。
WAIT_CLASSVARCHAR2(64)该等待事件所属的等待类别例如:'User I/O', 'Application', 'Concurrency', 'Network', 'Idle' (空闲等待类别通常可忽略)

🧠 核心原理与知识点

  • 等待事件是什么:当 Oracle 会话(Session)请求某种资源(如数据块、锁、 latch)但无法立即获得时,它会进入等待状态,并记录一个等待事件。这就像是系统在告诉你“我卡在什么地方了”。
  • 空闲 vs. 非空闲:等待事件分为两大类。空闲等待事件(Idle Wait Events)表示会话在等待工作任务(如 SQL*Net message from client),通常不是性能问题的直接证据。非空闲等待事件(Non-Idle Wait Events)则代表了真正的资源争用和瓶颈(如 buffer busy waits),是诊断调优的重点
  • 数据来源与底层V$SESSION_WAIT 是一个动态性能视图(Dynamic Performance View),其数据主要来源于 SGA 中的内存结构,而不是直接读取基表。其底层源头可以追溯到 X$ 表,这是 Oracle 内核中一系列神秘的内存结构,提供了实例各方面信息的底层接口。 随着版本迭代,许多 V$SESSION_WAIT 的信息在 V$SESSION 中也可查看。
  • 工作机理:Oracle 内核持续监控所有会话的状态。一旦发生等待,便会更新内部计数器和结构。V$SESSION_WAIT 等视图通过查询这些内存结构,近乎实时地(每秒采样)展现等待信息。

🔍 常用查询 SQL 示例

  1. 查看当前所有会话的等待情况(区分正在等待和上次等待)
SELECT sid, event, wait_time, state, seconds_in_wait, p1, p1text, p2, p2text
FROM v$session_wait
ORDER BY state, wait_time DESC;
  1. 列出系统中正在发生的非空闲等待事件及其次数
SELECT event, COUNT(*) AS waiting_sessions
FROM v$session_wait
WHERE wait_time = 0
AND event NOT IN ('SQL*Net message from client', 'pmon timer', 'rdbms ipc message', 'smon timer') -- 过滤常见空闲事件
GROUP BY event
ORDER BY waiting_sessions DESC;
  1. 查询特定等待事件的详细信息(例如:缓冲忙等待)
SELECT sw.sid, sw.p1 AS file_id, sw.p2 AS block_id, sw.p3 AS reason_code,
       ddf.file_name,
       DE.segment_name, DE.segment_type
FROM v$session_wait sw
JOIN dba_data_files ddf ON sw.p1 = ddf.file_id
LEFT JOIN dba_extents DE ON (sw.p2 BETWEEN DE.block_id AND DE.block_id + DE.blocks - 1 AND sw.p1 = DE.file_id)
WHERE sw.event = 'buffer busy waits'
AND sw.wait_time = 0;
  1. 关联 V$SESSION,获取等待会话的更多信息(如用户名、正在执行的SQL)
SELECT s.sid, s.username, s.program, sw.event, sw.wait_time, sw.state,
       sq.sql_text
FROM v$session s
JOIN v$session_wait sw ON s.sid = sw.sid
LEFT JOIN v$sql sq ON s.sql_id = sq.sql_id
WHERE sw.wait_time = 0
AND sw.event NOT LIKE '%idle%';
  1. 检查日志文件同步等待log file sync
SELECT sid, event, wait_time, state, p1, p1text, p2, p2text
FROM v$session_wait
WHERE event = 'log file sync';

👀 主要应用场景

  • 实时性能诊断:当数据库响应变慢时,快速查询 V$SESSION_WAIT 找出所有正在等待的会话和等待事件,迅速定位瓶颈源头(是I/O慢、锁冲突还是latch争用)。
  • 历史问题分析:结合 ASH (V$ACTIVE_SESSION_HISTORY)AWR 报告,可以回溯历史等待事件,分析特定时间段内的性能问题。
  • SQL调优:发现某个 SQL 等待事件集中(如 db file sequential read),可针对性优化该SQL(如调整索引、减少逻辑读)。
  • 容量规划与资源优化:分析持续的等待模式(如 log file parallel write),判断是否需要升级I/O子系统或调整Redo Log配置。

🔗 相关视图

  • V$SESSION:包含会话的完整信息,在 Oracle 10gR2 及之后版本也包含了 V$SESSION_WAIT 中的关键等待信息。
  • V$SESSION_EVENT:记录会话自启动以来所有等待事件的累计统计信息(总等待次数、总等待时间),用于会话级的整体性能分析。
  • V$SYSTEM_EVENT:记录实例自启动以来所有等待事件的全局累计统计,用于把握数据库整体的等待概况。
  • V$ACTIVE_SESSION_HISTORY (ASH):每秒对活动会话进行一次采样,记录其等待事件和历史信息,是进行历史问题回溯分析的强大工具
  • V$EVENT_NAME:包含了所有等待事件的元数据(名称、参数含义等查询)。

💎 总结与注意事项

  • TIMED_STATISTICS 参数务必设为 TRUE(或在 19c 中通常默认开启),才能获得准确的等待时间信息。
  • 优先关注 STATE='WAITING' (WAIT_TIME=0) 的会话,它们是当前正在经历等待、可能影响性能的对象。
  • 正确解读 WAIT_TIMESTATE 字段是理解会话当前状态的关键。
  • 结合 P1, P2, P3 参数和 V$EVENT_NAME 视图或官方文档,才能准确解读等待事件的具体含义。
  • 绝大多数性能问题并非由单一等待事件造成,需要综合判断(结合AWR/ASH、SQL查询、系统指标等)。

希望以上详细的解释能帮助你更好地使用 V$SESSION_WAIT 视图来诊断和优化你的 Oracle 数据库。

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值