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

在这里插入图片描述
由于搜索结果中关于 V$SERV_MOD_ACT_STATS 的具体详细信息较少,我会结合自己的知识来为你提供一份全面的解释。Oracle 19C 中的 V$SERV_MOD_ACT_STATS 动态性能视图用于提供按服务(Service)、模块(Module)和操作(Action)细分的性能统计信息。这为数据库管理员提供了极其精细的维度来监控和诊断应用程序的性能问题。

📊 1. ✨ 视图概述与作用

  • 核心作用V$SERV_MOD_ACT_STATS 视图提供在 SQL 语句执行级别,按服务名、模块名、操作名组合聚合的性能统计信息。它允许你将性能指标(如 DB Time, CPU Time, 逻辑读等)追溯到应用程序中特定的功能模块甚至操作步骤。
  • 重要性:在现代复杂的应用程序中,一个数据库服务可能被多个应用模块使用,每个模块又包含多种操作。通过此视图,可以精确定位是哪个应用的哪个模块的哪个操作导致了资源消耗或性能瓶颈,实现了真正的端到端性能管理

🔍 2. 🧐 主要应用场景

  • 应用性能根因分析:当数据库整体性能下降时,快速定位到具体的应用模块和操作。
  • 代码级调优:识别应用程序中哪些特定的 SQL 执行阶段或业务逻辑最耗费资源,为开发人员提供明确的优化目标。
  • 资源消耗核算:在多租户或大型应用中,统计不同功能模块或用户组的资源使用情况,用于成本分摊或容量规划。
  • 监控特定操作:针对已知的关键或高风险操作(如特定交易、批处理任务)进行持续监控。
  • 验证 DBMS_MONITOR 配置效果:在使用 DBMS_MONITOR.SERV_MOD_ACT_STAT_ENABLE 过程启用特定组合的统计信息收集后,通过此视图查看收集到的数据。

📋 3. 📋 字段详解

V$SERV_MOD_ACT_STATS 包含多个字段,用于唯一标识一个统计维度并记录其性能数据。

字段名数据类型描述
SERVICE_NAMEVARCHAR2(64)服务的名称。应用程序连接数据库时使用的服务标识符。
MODULE_NAMEVARCHAR2(64)模块的名称。通常由应用程序通过 DBMS_APPLICATION_INFO.SET_MODULE 设置,表示应用中的功能模块。
ACTION_NAMEVARCHAR2(64)操作的名称。在模块内更细粒度的操作标识,通常通过 DBMS_APPLICATION_INFO.SET_ACTION 设置。
STAT_IDNUMBER统计项目的标识符ID。与 V$STATNAME 视图中的 STAT_ID 关联,用于确定统计项的类型。
VALUENUMBER该统计项目的累计值。从统计被启用开始累加,显示该服务-模块-操作组合在该统计项上的总值。
CON_IDNUMBER容器ID。在多租户环境中,标识该统计信息所属的容器。

常见 STAT_ID 对应的统计项(需关联 V$STATNAME):

  • 139: DB time
  • 140: DB CPU
  • 9: session logical reads (逻辑读)
  • 15: physical reads (物理读)
  • 97: execute count (执行次数)
  • 100: user calls (用户调用次数)

🔗 4. 🔗 相关视图与基表

4.1 相关性能视图
  • VSTATNAME∗∗:提供‘STATID‘到可读统计名称(如"DBtime")的映射,∗∗必须关联此视图才能理解‘VSTATNAME**: 提供 `STAT_ID` 到可读统计名称(如 "DB time")的映射,**必须关联此视图才能理解 `VSTATNAME:提供STATID到可读统计名称(如"DBtime")的映射,必须关联此视图才能理解VSERV_MOD_ACT_STATS` 中的数据
  • **VSERVICESTATS∗∗:仅按服务维度的统计信息,可以看作是‘VSERVICE_STATS**: 仅按服务维度的统计信息,可以看作是 `VSERVICESTATS:仅按服务维度的统计信息,可以看作是VSERV_MOD_ACT_STATS` 的聚合。
  • V$SESSION: 包含当前会话的 SERVICE_NAME, MODULE, ACTION 信息,可用于实时监控。
  • DBA_HIST_SERV_MOD_ACT_STATS: AWR 历史快照中保存的此视图数据,用于历史分析。
4.2 底层基表 (X$ Tables) 与原理

V$SERV_MOD_ACT_STATS 和其他的动态性能视图一样,其数据来源于 SGA 中的内存数据结构

  • 底层原理

    1. 统计收集开关:默认情况下,Oracle 不会收集服务-模块-操作级别的细粒度统计信息。必须先使用 DBMS_MONITOR.SERV_MOD_ACT_STAT_ENABLE 过程显式启用对特定组合的统计收集。
    2. 数据收集:一旦启用,Oracle 内核会在 SQL 执行时,检查当前会话的 SERVICE_NAME, MODULE, ACTION 属性。如果匹配已启用的组合,则会更新内存中(X$ 表)对应的统计计数器
    3. 内存存储:这些聚合后的统计数据被存储在内存中的 X$ 表(具体名称未公开,如 X$KSMAS 或类似结构)中。
    4. 视图暴露V$SERV_MOD_ACT_STATS 视图通过 SQL 层查询这些 X$ 结构,提供可读的统计信息。
  • 数据生命周期:视图中的值是累计值,从该服务-模块-操作组合的统计被启用开始累加,直到实例重启或被禁用后重置。数据是实时更新的。

⚙️ 5. ⚙️ 常用查询 SQL

5.1 启用与禁用统计收集

使用 DBMS_MONITOR 包来控制对特定组合的统计信息收集。

-- 启用指定服务、模块、操作组合的统计信息收集
BEGIN
  DBMS_MONITOR.SERV_MOD_ACT_STAT_ENABLE(
    service_name  => 'MY_APP_SVC',
    module_name   => 'PAYMENT_MODULE',
    action_name   => 'PROCESS_TRANSACTION'
  );
END;
/

-- 禁用指定服务、模块、操作组合的统计信息收集
BEGIN
  DBMS_MONITOR.SERV_MOD_ACT_STAT_DISABLE(
    service_name  => 'MY_APP_SVC',
    module_name   => 'PAYMENT_MODULE',
    action_name   => 'PROCESS_TRANSACTION'
  );
END;
/
5.2 查询已启用的组合及其统计信息

此查询关联 V$SERV_MOD_ACT_STATSV$STATNAME,显示收集到的具体性能数据。

SELECT s.service_name,
       s.module_name,
       s.action_name,
       n.name AS statistic_name,
       s.value
FROM v$serv_mod_act_stats s
JOIN v$statname n ON s.stat_id = n.stat_id
WHERE n.name IN ('DB time', 'session logical reads', 'execute count')
  AND s.value > 0
ORDER BY s.service_name, s.module_name, s.action_name, n.name;
5.3 分析最耗资源的操作

查找消耗最多 DB Time 或逻辑读的应用操作。

SELECT s.service_name,
       s.module_name,
       s.action_name,
       SUM(CASE WHEN n.name = 'DB time' THEN s.value ELSE 0 END) / 1000000 AS db_time_sec,
       SUM(CASE WHEN n.name = 'session logical reads' THEN s.value ELSE 0 END) AS logical_reads
FROM v$serv_mod_act_stats s
JOIN v$statname n ON s.stat_id = n.stat_id
WHERE n.name IN ('DB time', 'session logical reads')
GROUP BY s.service_name, s.module_name, s.action_name
HAVING SUM(CASE WHEN n.name = 'DB time' THEN s.value ELSE 0 END) > 0
ORDER BY db_time_sec DESC;
5.4 监控特定模块的所有操作

查看一个特定模块内所有操作的性能概况。

SELECT s.action_name,
       n.name AS statistic_name,
       s.value
FROM v$serv_mod_act_stats s
JOIN v$statname n ON s.stat_id = n.stat_id
WHERE s.service_name = 'ERP_SVC'
  AND s.module_name = 'ORDER_PROCESSING'
  AND n.name IN ('DB time', 'CPU used by this session', 'user calls')
ORDER BY s.action_name, n.name;

💎 6. 💎 核心知识点与原理

  1. 应用 instrumentationV$SERV_MOD_ACT_STATS 的有效性严重依赖于应用程序是否正确地设置了 MODULEACTION 信息。这通常需要在应用代码中显式调用 DBMS_APPLICATION_INFO.SET_MODULESET_ACTION 过程。没有这些,模块和操作信息可能就是空的或泛化的。
  2. 性能开销:启用细粒度的统计信息收集会带来轻微的性能开销,因为需要为每个匹配的 SQL 执行维护额外的计数器。因此,通常只针对特定的、需要重点关注的服务或模块启用它,而不是全局启用。
  3. 统计维度:该视图提供了比 V$SERVICE_STATS 更细粒度的视角,允许你将性能问题追溯到代码的特定区域。
  4. 与 AWR 集成:虽然 V$SERV_MOD_ACT_STATS 本身是动态的,但 AWR 快照会定期将其内容捕获到 DBA_HIST_SERV_MOD_ACT_STATS 中,从而支持历史性能分析和趋势预测。
  5. 与 Trace 关联:通过模块和操作信息,可以很容易地将宏观的性能指标与 SQL Trace 或优化器执行计划等微观诊断工具关联起来。

📝 7. 📝 总结

V$SERV_MOD_ACT_STATS 视图是 Oracle 提供的用于应用性能管理(APM) 的强大工具之一。它将数据库性能数据与应用程序的上下文(服务、模块、操作)清晰地联系起来。

通过使用此视图,DBA 和性能分析师可以:

  • 打破壁垒:有效地与应用开发团队沟通,提供确凿的证据指出性能问题的具体位置。
  • 实现精准优化:将优化精力集中在最能带来收益的应用程序代码部分。
  • 建立性能基线:监控关键业务操作的性能变化趋势。

要有效使用此视图,需要应用程序、DBA 和开发团队的共同协作:应用程序需要正确设置模块和操作信息,DBA 需要合理配置统计收集,而开发团队则需要根据视图提供的洞察来优化代码。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值