idle events是oracle中wait_class为'idle'的等待事件,如sql*net message from client等,它们反映客户端空闲状态而非数据库性能问题,若不剔除会干扰awr分析、误导dba定位假热点。
什么是 idle events,为什么它们会干扰 awr 分析
AWR 报告里出现大量 SQL*Net message from client、PL/SQL lock timer、virtual circuit status 这类等待事件,不是数据库真出了问题,而是客户端没在干活——连接空闲、定时器休眠、网络收发间隙。它们天然占比高,但和性能瓶颈无关。不筛掉,就会把 DBA 的注意力拽偏到“假热点”上。
用 dba_hist_active_sess_history 过滤掉 Idle Events 的实操方式
AWR 默认汇总视图(如 dba_hist_system_event)不区分 idle/non-idle,得回溯到 ASH 原始粒度才能精准剔除。关键在 session_state 和 event 联合判断:
-
session_state = 'WAITING'且event在 Oracle 官方定义的 idle 列表里,才视为无效等待 - Oracle 的 idle event 名单藏在
v$event_name的wait_class= 'Idle' 里,别硬编码字符串 - 直接查
dba_hist_active_sess_history比聚合视图更可靠:它保留了每秒采样原始状态,没被平均或归并过
示例过滤条件:
WHERE session_state = 'WAITING' AND event NOT IN (SELECT event FROM v$event_name WHERE wait_class = 'Idle')
awr_report_text 生成时跳过 Idle Events 的配置陷阱
用 awrrpt.sql 或 DBMS_WORKLOAD_REPOSITORY.AWR_REPORT_TEXT 生成文本报告时,它默认照单全收所有事件——包括 idle。没有开关能一键关掉 idle 等待显示。
- 别指望修改
awr_pdb_report或参数文件来隐藏 idle;这些工具不提供该控制粒度 - 真正可行的是:先用上一节的 ASH 查询提取非 idle 的 top N 等待,再人工补进报告备注里
- 若用 OEM 或第三方监控,注意确认其“Top Activity”图表是否已内置 idle 过滤——很多界面默认没开,看着像数据库卡,其实是前端连着没发 SQL
网络类 idle 等待(如 SQL*Net)的特殊处理逻辑
SQL*Net message from client 和 SQL*Net more data from client 是最常被误读的 idle 事件,但它们有个例外场景:当应用使用长连接 + 频繁小包发送(比如某些 Java JDBC 批量插入未设 batch size),这些等待可能真实反映网络或客户端吞吐瓶颈。
- 单纯看 AWR 里占比高?先检查
client_elapsed_time和cpu_time在 ASH 中的分布比例 - 如果
SQL*Net等待集中在少数几个sql_id上,且对应应用模块明确,就得抓客户端日志,而不是直接归为 idle 忽略 - Oracle 19c+ 的
DBA_HIST_SQLSTAT里elapsed_time_delta / executions_delta若显著高于同类 SQL,配合网络 idle 等待突增,就是客户端行为异常的信号
idle 不是铁板一块,网络类尤其要结合 sql_id 和客户端行为交叉验证。漏掉这个环节,就容易把慢应用错判成“数据库没事”。










