Top Session列表比SQL列表更早暴露根因,因其按会话维度聚合ON CPU与等待事件样本,绕过SQL文本不一致导致的游标分裂;关键字段是Session State为ON CPU且AAS>1、Blocking Session Status为VALID、Program标识进程来源;它基于ASH每秒采样,可捕获v$session遗漏的瞬时抢占,如短连接风暴、死锁回滚前快照及library cache lock争用。
Top Session列表为什么比SQL列表更早暴露根因
因为top session列表按会话维度聚合了所有活动样本(on cpu + 等待事件),天然绕过了“sql文本不一致”导致的游标分裂问题。一个应用线程持续执行硬解析、频繁切换绑定变量、或用jdbc拼接字面量,会让同一逻辑sql在v$sql里分散成几十个sql_id;但它的os进程、session_id、program和client_identifier始终不变——ash正是靠这个锚点把碎片行为聚合成完整画像。
Top Session里最关键的三个字段不是sql_id而是这些
很多人盯着sql_id列排序,却漏掉真正决定优先级的三个字段:
-
Session State为ON CPU且AAS> 1:说明该会话平均占满一个以上CPU核心,不是“偶尔跑一下”,是持续霸占资源 -
Blocking Session Status为VALID:表示它当前正被上游会话阻塞,此时杀它没用,得顺链往上找根因 -
Program值是oracle@host (J000)或jdbc thin client:前者指向DBMS_SCHEDULER作业,后者直接定位到应用服务节点,避免在数据库层空转
为什么Top Session能抓到v$session看不到的瞬时抢占
v$session只反映查询执行那一刻的状态,而Top Session来自v$active_session_history内存滚动采样,每秒一条记录。当出现以下情况时,v$session大概率为空,但Top Session已有痕迹:
- 短连接风暴:应用每秒建100个连接又立刻断开,
v$session里几乎留不下痕迹,但ASH中event = 'SQL*Net message from client'+wait_time = 0会密集出现 - 死锁自动回滚后:Oracle已清空
blocking_session字段,但ASH里仍保留死锁发生前2–3秒内两个会话互相指向的sample_time快照 - Library Cache Lock争用:硬解析完成瞬间就释放锁,
v$session查不到等待,但ASH中event = 'library cache lock'+p3 = 0x4f0003可定位到具体namespace和mode
Top Session排序数值的实际物理意义
列表里的“% Activity”不是百分比,而是该会话在采样窗口内占用的“活跃会话秒数”占比。例如某行显示% Activity = 12.5,采样窗口为60分钟(3600秒),则该会话实际活跃了12.5% × 3600 = 450秒——相当于它独占数据库资源7.5分钟。这个数字比cpu_samples更直观,因为它已自动折算不同采样密度(如RAC中多实例并行采样)的影响。
容易被忽略的是:如果同一个session_id在Top Session里反复出现在不同时间点的报告中,且sql_plan_hash_value频繁变化,基本可判定是统计信息过期或绑定变量窥探失效,而不是SQL本身写得差。


















