
好的,我们来全面深入地解析 Oracle 19c 数据库中极其重要的 V$SESS_TIME_MODEL 动态性能视图。这个视图是 Oracle 基于时间的性能诊断方法(Time-Based Performance Diagnosis)的核心,它从“时间消耗”的角度,量化了数据库在各种内部操作上所花费的代价。
V$SESS_TIME_MODEL 视图提供了会话级别的详细时间统计信息。它记录了自每个会话启动以来,在各种数据库操作(如解析、执行、SQL 执行、PL/SQL 执行等)上所花费的累计时间(微秒)。它回答了“数据库的时间都花在哪里了?”这个根本性的性能问题。
一、字段含义详解
V$SESS_TIME_MODEL 的结构与 V$SESSTAT 类似,需要通过 STAT_ID 与 V$SYSTEM_TIME_MODEL 或 V$TIME_MODEL_NAME 关联来获取有意义的统计项名称。
| 字段名 | 数据类型 | 描述 | 重要说明与解读 |
|---|---|---|---|
| SID | NUMBER | 会话标识符 (Session Identifier)。 | 与 V$SESSION.SID 直接对应,是关联会话上下文的关键。 |
| STAT_ID | NUMBER | 时间统计项编号。这是一个数字代码,用于唯一标识一种时间统计类型。 | 此字段本身无意义,必须与 V$TIME_MODEL_NAME 视图关联才能知道它代表什么时间统计。 |
| VALUE | NUMBER | 该时间统计项在对应会话中的累计时间(单位:微秒,1秒=1,000,000微秒)。 | 这是核心数据。表示从会话启动到查询瞬间,在该类操作上花费的总时间。 |
核心时间统计项(通过 STAT_ID 关联 V$TIME_MODEL_NAME.STAT_NAME 获取)举例:
| 时间统计项名称 (V$TIME_MODEL_NAME.STAT_NAME) | 统计项# (~STAT_ID) | 描述 | 性能诊断意义 |
|---|---|---|---|
| DB time | 3649082374 | 会话花费在数据库调用上的总时间(微秒)。这是最宏观、最重要的指标。 | 此时间包括CPU时间和等待时间。会话的响应时间直接由此衡量。DB time > elapsed time 表示使用了并行查询。 |
| DB CPU | 2748282437 | 会话在数据库调用中消耗的CPU时间(微秒)。 | 核心中的核心。高的DB CPU表示计算密集型操作,通常需要优化SQL(减少逻辑读)、调整CPU资源或优化PL/SQL。 |
| sql execute elapsed time | 3875070343 | 用于SQL执行操作的总时间。 | 如果此值占DB time很高,说明系统时间主要花在了真正执行SQL上,需要优化SQL性能。 |
| parse time elapsed | 3875070344 | 用于SQL解析的总时间。 | 高的解析时间可能意味着共享池问题、无效的SQL、或缺乏绑定变量导致的大量硬解析。 |
| hard parse elapsed time | 3875070346 | 用于硬解析的总时间。 | 关键优化点。硬解析消耗大量CPU和Latch资源。此值应尽可能低。 |
| hard parse (sharing criteria) elapsed time | 3875070351 | 在硬解析过程中,检查共享标准(如检查SQL是否已存在)所花费的时间。 | |
| PL/SQL execution elapsed time | 3875070353 | 用于PL/SQL执行的总时间。 | 如果此值很高,说明大量时间消耗在PL/SQL引擎中,需要优化PL/SQL代码。 |
| PL/SQL compilation elapsed time | 4010223994 | 用于PL/SQL编译的时间。 | |
| Java execution elapsed time | 4064628306 | 用于Java执行的时间。 | |
| background elapsed time | 2545375166 | 后台进程消耗的总时间。 | |
| background cpu time | 2545375167 | 后台进程消耗的CPU时间。 | |
| connection management call elapsed time | 4146888793 | 连接管理调用(如登录/注销)所花费的时间。 |
注:具体的 STAT_ID 编号是内部值,在不同版本中可能变化,但名称保持不变。始终通过 V$TIME_MODEL_NAME 查询确认。
二、核心原理与底层机制
1. 数据来源与底层基表
V$SESS_TIME_MODEL 是一个动态性能视图,其数据来源于 SGA 中为每个会话分配的内存结构。每个会话在 PGA/UGA 中都有一个区域用于存储其所有时间统计项的累加器。
其底层源是 X$ 表,通常是 X$KSLSETM(或类似结构)。这些 X$ 表直接映射了 SGA 中用于存储所有会话时间模型统计信息的计数器数组。
- 工作原理:
- 会话创建:当一个新的会话建立时,Oracle 会在内存中为其分配一个时间统计信息累加器数组,并将所有计数器初始化为 0。
- 活动计时:每当会话开始一个受监控的操作(如解析、执行)时,Oracle 内核会记录开始时间戳。当操作结束时,计算耗时(微秒),并原子性地累加到该会话对应的时间统计项累加器中。
- 实时查询:当查询
V$SESS_TIME_MODEL时,Oracle 直接读取这些内存中的累加器值,因此其性能极高,且数据是实时的。 - 会话终止:会话结束时,其对应的内存累加器区域被释放,该会话的记录也从视图中消失。
2. 时间模型的概念与重要性
Oracle 的时间模型是性能诊断的基石。它基于一个简单而强大的理念:数据库响应时间 = 各类操作时间的总和。
- DB Time = DB CPU + Non-Idle Wait Time + Others
- 通过分析各部分时间的占比,可以快速定位性能瓶颈的类型:
- 高
DB CPU:瓶颈在CPU(计算能力不足或SQL效率低下)。 - 高
sql execute elapsed time:瓶颈在SQL执行(需要优化SQL)。 - 高
parse time elapsed:瓶颈在解析(需要应用使用绑定变量,或调整共享池)。 - 如果
DB Time主要由等待事件构成,则需要去V$SESSION_WAIT等视图进一步分析具体的等待。
- 高
3. 与 V$SYSTEM_TIME_MODEL 和 V$SYS_TIME_MODEL 的关系
V$SESS_TIME_MODEL:每个会话的时间统计信息。V$SYSTEM_TIME_MODEL:整个实例的时间统计信息,是所有会话时间信息的汇总。SUM(V$SESS_TIME_MODEL.VALUE)≈V$SYSTEM_TIME_MODEL.VALUE(后台进程时间除外)。
三、常用查询 SQL 示例
-
查看当前会话自身的时间模型统计(最常用)
SELECT stm.stat_id, tn.stat_name, ROUND(stm.value / 1000000, 2) AS time_seconds FROM v$sess_time_model stm JOIN v$time_model_name tn ON stm.stat_id = tn.stat_id WHERE stm.sid = (SELECT sid FROM v$mystat WHERE rownum = 1) AND tn.stat_name IN ('DB time', 'DB CPU', 'sql execute elapsed time', 'parse time elapsed', 'hard parse elapsed time', 'PL/SQL execution elapsed time') ORDER BY stm.value DESC; -
找出系统中消耗总时间(DB Time)最多的会话
SELECT s.sid, s.username, s.program, s.sql_id, tn.stat_name, ROUND(stm.value / 1000000, 2) AS time_seconds FROM v$sess_time_model stm JOIN v$time_model_name tn ON stm.stat_id = tn.stat_id JOIN v$session s ON stm.sid = s.sid WHERE tn.stat_name = 'DB time' AND s.type = 'USER' AND s.status = 'ACTIVE' ORDER BY stm.value DESC; -
分析高CPU消耗的会话(定位计算密集型操作)
SELECT s.sid, s.username, s.module, s.action, s.sql_id, ROUND(stm.value / 1000000, 2) AS db_cpu_sec FROM v$sess_time_model stm JOIN v$session s ON stm.sid = s.sid WHERE stm.stat_id = (SELECT stat_id FROM v$time_model_name WHERE stat_name = 'DB CPU') AND s.type = 'USER' ORDER BY stm.value DESC; -
计算会话时间占比(诊断瓶颈类型)
SELECT sid, ROUND(MAX(CASE stat_name WHEN 'DB time' THEN value ELSE 0 END) / 1000000, 2) AS db_time_sec, ROUND(MAX(CASE stat_name WHEN 'DB CPU' THEN value ELSE 0 END) / 1000000, 2) AS db_cpu_sec, ROUND(MAX(CASE stat_name WHEN 'sql execute elapsed time' THEN value ELSE 0 END) / 1000000, 2) AS sql_exec_time_sec, ROUND(MAX(CASE stat_name WHEN 'parse time elapsed' THEN value ELSE 0 END) / 1000000, 2) AS parse_time_sec, ROUND( (MAX(CASE stat_name WHEN 'DB CPU' THEN value ELSE 0 END) / NULLIF(MAX(CASE stat_name WHEN 'DB time' THEN value ELSE 0 END), 0) ) * 100, 2) AS cpu_pct FROM (SELECT stm.sid, tn.stat_name, stm.value FROM v$sess_time_model stm JOIN v$time_model_name tn ON stm.stat_id = tn.stat_id WHERE tn.stat_name IN ('DB time', 'DB CPU', 'sql execute elapsed time', 'parse time elapsed')) GROUP BY sid HAVING MAX(CASE stat_name WHEN 'DB time' THEN value ELSE 0 END) > 0 ORDER BY db_time_sec DESC; -
监控硬解析时间过高的会话
SELECT s.sid, s.username, s.program, s.sql_id, ROUND(stm.value / 1000000, 2) AS hard_parse_time_sec FROM v$sess_time_model stm JOIN v$time_model_name tn ON stm.stat_id = tn.stat_id JOIN v$session s ON stm.sid = s.sid WHERE tn.stat_name = 'hard parse elapsed time' AND stm.value > 10000000 -- 硬解析时间超过10秒 ORDER BY stm.value DESC;
四、主要应用场景
-
性能瓶颈快速定位:
这是时间模型最主要的用途。当数据库性能出现问题时,DBA 可以首先查看V$SYSTEM_TIME_MODEL找到系统级的主要时间消耗,然后使用V$SESS_TIME_MODEL下钻(Drill Down) 到具体的会话,快速判断瓶颈是CPU、SQL执行、解析还是PL/SQL。 -
SQL调优成效验证:
在优化一条SQL语句之前和之后,分别记录当前会话的DB CPU和sql execute elapsed time,可以清晰地量化优化带来的性能提升。 -
应用逻辑分析:
通过分析不同功能模块产生的会话的时间模型分布,可以了解应用对数据库资源的消耗模式(是CPU密集型还是解析密集型),从而指导应用架构优化。 -
容量规划与资源分配:
通过分析历史时间段内各时间统计项的增长情况,可以为CPU扩容、内存调整(减少解析)等容量规划提供数据支持。 -
综合诊断的核心环节:
V$SESS_TIME_MODEL是承上启下的关键视图。首先通过它找到消耗时间最多的会话和操作类型,然后:- 如果是高
DB CPU,去检查V$SESSTAT中的逻辑读和V$SQL查看具体SQL。 - 如果是高
parse time elapsed,去检查V$SESSTAT中的硬解析次数。 - 如果时间主要不在CPU上,则去
V$SESSION_WAIT分析具体的等待事件。
- 如果是高
五、相关视图
V$TIME_MODEL_NAME:必须关联的字典视图。提供了STAT_ID到可读名称 (STAT_NAME) 的映射。V$SESSION:提供会话的上下文信息(用户、程序、状态、当前SQL等),是关联分析的关键。V$SYSTEM_TIME_MODEL:系统级时间模型视图。V$SESSTAT:提供会话级的操作次数统计,与时间模型结合可以计算平均操作时间(例如:平均每次硬解析时间 =hard parse elapsed time/parse count (hard))。V$SQL:用于通过SQL_ID获取消耗大量时间的SQL文本和执行计划。
总结:V$SESS_TIME_MODEL 是 Oracle 数据库基于时间的性能诊断方法的核心实现。它从一个统一的维度——时间——量化了数据库内部的所有活动,使得性能分析变得可测量、可比较、可下钻。熟练掌握这个视图,意味着你掌握了现代Oracle性能调优的核心思想,能够从宏观到微观,系统地分析和解决数据库性能问题。
欢迎关注我的公众号《IT小Chen》
Oracle V$SESS_TIME_MODEL详解
190

被折叠的 条评论
为什么被折叠?



