DB Time > Elapsed Time 正常,是并发模型自然结果;核心看 AAS = DB Time / Elapsed Time,AAS 反映平均活跃会话数,需结合 CPU 核数、Top Events 和响应时间综合判断真实负载。
DB Time > Elapsed Time 是正常现象,不是错误
db time 远超 elapsed time 本身不表示数据库出错,而是 oracle 多会话并发模型的自然结果。db time 是所有前台会话(v$session 中 type = 'user')在采样周期内消耗的 cpu 时间 + 非空闲等待时间(如 db file sequential read、log file sync)的总和;而 elapsed time 就是快照间隔的真实墙钟时间(wall clock)。一个 8 核服务器上同时活跃 20 个会话,每个平均占用 3 分钟资源,db time 就可能达到 60 分钟——哪怕 elapsed time 只有 5 分钟。
重点看 AAS = DB Time / Elapsed Time 这个比值
AAS(Average Active Session)才是衡量负载强度的核心指标,它直接反映“平均有多少个会话在非空闲状态下争抢资源”。这个值没有单位,但有明确的业务含义:
- 若 AAS ≈ CPU 核数(比如 8 核机器上 AAS = 7.2),说明 CPU 利用率已趋近饱和
- 若 AAS > CPU 核数(如 AAS = 15),大概率存在严重排队:要么是 CPU run queue 拉长(
resmgr:cpu quantum或操作系统runq-sz高),要么是 IO 或日志同步类等待拖住大量会话 - 若 AAS 稳定在 0.3 以下,即使 DB Time 数值很大(比如跨长周期累计),实际负载也很轻
排查高 DB Time 的真实瓶颈,别只盯 SQL
很多人一看到 DB Time 高就去翻 Top SQL,但实际中大量 DB Time 可能根本不在 SQL 执行里。常见被忽略的“隐形消耗”包括:
-
COMMIT和ROLLBACK不计入sql execute elapsed time,但它们的log file sync等待全算进 DB Time —— 如果报告里log file sync占比超 20%,就要检查应用是否过度提交、redo 日志是否过小或写入慢 - 大量短事务 + 高频解析:
library cache lock或cursor: pin S wait on X等争用事件不会出现在 Top SQL,却显著推高 DB Time - 并行查询(
PX)会把子进程时间也累加进 DB Time,但主 SQL 可能只排在中下游 —— 要查Top Segments by DB Time或Instance Activity Stats中的parallel operations downgraded
验证是否真有性能问题,得结合响应时间和会话状态
DB Time 高 ≠ 用户觉得慢。关键要看实际业务反馈:
- 如果
DB Time / Elapsed Time很高(比如 AAS=12),但SQL ID对应的elapsed_time(单次执行耗时)和response time(应用端测得)都正常,那只是“系统忙”,不是“系统卡” - 真正要警惕的是:AAS 高 +
Top Events中出现大量enq: TX - row lock contention、latch: shared pool或read by other session—— 这些代表资源争用已传导到业务请求层面 - 用
SELECT sid, event, p1text, p1, state FROM v$session WHERE state = 'WAITING'实时抓一把活跃等待,比只看 AWR 报告更及时
DB Time 本质是“所有用户会话的资源消耗总账”,不是单个请求的耗时。它的数值大小必须始终绑定 CPU 核数、AAS、Top Events 三者一起读;脱离这些谈 DB Time 高低,就像只看总电费不看用了几台空调。











