
好的,我将为您全面、深入地解析 Oracle 19C 数据库中的 V$SQL_MONITOR_STATNAME 动态性能视图。
这个视图是 SQL 监控功能体系的"元数据字典",它定义了 V$SQL_MONITOR_SESSTAT 等视图中可用的统计信息类型及其属性,是理解 SQL 监控数据的基础。
🔍 Oracle 19C V$SQL_MONITOR_STATNAME 动态性能视图详解
1️⃣ 视图概述与核心作用
V$SQL_MONITOR_STATNAME 动态性能视图是一个静态的字典式视图,它包含了所有可以被 SQL 监控功能(SQL Monitor)跟踪和记录的会话统计信息的定义和元数据。
您可以将其理解为 V$SQL_MONITOR_SESSTAT 的"数据字典" 或 “说明手册” 。V$SQL_MONITOR_SESSTAT 中 STATISTIC# 字段的数字具体代表什么含义,其名称、分类、数据类型等属性,都定义在 V$SQL_MONITOR_STATNAME 中。
该视图的核心作用在于:
- 提供元数据映射:将
V$SQL_MONITOR_SESSTAT.STATISTIC#(数字代码)转换为人类可读的STATISTIC_NAME(如session logical reads)。 - 定义统计信息属性:说明每个统计信息的类型(例如,是增量值还是累计值)、单位、所属分类等。
- 确定监控范围:明确 SQL 监控功能具体捕获了哪些类型的统计信息。
- 辅助查询与报告:在编写监控查询或生成自定义报告时,用于关联、过滤和分类不同的性能指标。
2️⃣ 字段详细含义
V$SQL_MONITOR_STATNAME 的字段结构相对简单,但每个字段都清晰地定义了一个监控指标的特性。
| 字段名称 | 数据类型 | 含义说明 |
|---|---|---|
| STAT_ID | NUMBER | 统计信息的唯一数字标识符。这是最关键的字段,它与 V$SQL_MONITOR_SESSTAT.STATISTIC# 字段直接对应。通过这个ID将监控数据与其定义关联起来。 |
| NAME | VARCHAR2(64) | 统计信息的可读名称。这是统计信息的英文名称,与 V$STATNAME.NAME 中的值相同(例如:session logical reads, physical reads, redo size)。 |
| STAT_TYPE | VARCHAR2(1) | 统计信息的类型。表示该统计值在SQL监控上下文中的行为: - C: 累计型(Cumulative)。这是绝大多数统计项的类型。它表示该统计值是一个从SQL开始执行到当前时刻(或结束时刻)的增量。例如,session logical reads 的增加量。- G: ** gauge型**。表示该统计值是一个瞬时值,就像仪表盘上的读数。在SQL监控中较少见。 |
| STAT_DESC | VARCHAR2(64) | 统计信息的简短描述。对NAME的进一步解释,但通常NAME已足够清晰。 |
| DISPLAY_NAME | VARCHAR2(64) | 用于显示的名称。在某些上下文(如Enterprise Manager)中可能使用的显示名称。 |
| DISPLAY_ORDER | NUMBER | 显示顺序。建议在显示这些统计信息时采用的排序顺序,可能用于工具中的默认布局。 |
| DISPLAY_FLAG | VARCHAR2(1) | 显示标志。指示该统计信息是否默认应该被显示(例如,在Oracle提供的标准报告中)。 |
| CON_ID | NUMBER | 容器ID。在多租户环境(CDB)中,此字段标识该行信息所属的容器。值为 0 表示该行数据属于CDB$ROOT(根容器)。对于此视图,所有容器的数据通常相同。 |
核心字段关系:V$SQL_MONITOR_SESSTAT.STATISTIC# = V$SQL_MONITOR_STATNAME.STAT_ID
3️⃣ 相关视图与基表
3.1 核心相关视图
-
V$SQL_MONITOR_SESSTAT:这是最直接的相关视图。V$SQL_MONITOR_STATNAME的存在就是为了给V$SQL_MONITOR_SESSTAT中的数字代码提供可读的解释。任何对V$SQL_MONITOR_SESSTAT的查询,只要想获得可读的统计信息名称,就必须关联此视图。-- 标准关联查询:将监控数据与可读名称结合 SELECT sms.sql_id, smst.name AS statistic_name, sms.value FROM v$sql_monitor_sesstat sms JOIN v$sql_monitor_statname smst ON sms.statistic# = smst.stat_id WHERE sms.sql_id = '&sql_id' AND sms.sql_exec_id = &sql_exec_id ORDER BY sms.value DESC; -
V$STATNAME:这是 Oracle 数据库全局的统计信息名称字典视图。它包含了数据库所有可能的统计信息定义,范围远大于V$SQL_MONITOR_STATNAME。- 关键区别:
V$SQL_MONITOR_STATNAME是V$STATNAME的一个子集。它只包含那些可以被 SQL Monitor 功能捕获和记录的统计信息。 - 两者通过
NAME字段相关联。V$SQL_MONITOR_STATNAME.NAME=V$STATNAME.NAME。
- 关键区别:
-
V$SQL_MONITOR:SQL 监控的摘要视图。V$SQL_MONITOR中的一些字段(如BUFFER_GETS,DISK_READS)本质上是V$SQL_MONITOR_SESSTAT中对应统计信息值的汇总,而这些统计信息的定义就在V$SQL_MONITOR_STATNAME中。 -
V$SESSTAT:提供所有会话的统计信息瞬时值。V$SQL_MONITOR_SESSTAT记录的是增量,而其统计项定义与V$SESSTAT共享V$STATNAME字典。
3.2 底层基表
与之前讨论的 V$SQL_MONITOR 系列视图不同,V$SQL_MONITOR_STATNAME 的内容不是动态的,而是静态的。
它的数据来源于数据库的内部数据字典,很可能基于一个如 X$QESNASTAT 或类似的 X$ 表。这个 X$ 表在数据库实例启动时,根据软件版本和组件被初始化为一个固定的值列表。
重要说明:
- 该视图的内容在数据库运行期间不会改变。它是在 Oracle 软件编译和构建时就确定好的元数据。
- 不同版本的 Oracle 数据库,此视图的内容可能会有所不同(会有统计信息的增删)。
- 由于其静态字典的性质,通常不需要关心其底层基表,直接查询
V$SQL_MONITOR_STATNAME视图即可。
4️⃣ 底层原理与机制
4.1 静态元数据注册
V$SQL_MONITOR_STATNAME 的底层原理是静态元数据注册机制:
- 编译时确定:Oracle 数据库在软件开发和编译阶段,就已经定义好了 SQL 监控功能需要支持哪些性能统计指标。
- 内存加载:当数据库实例启动时,这些定义好的元数据(统计信息ID、名称、类型等)被加载到内存的一个固定区域。
- 视图映射:
V$SQL_MONITOR_STATNAME视图直接映射到这块内存区域,提供了一个只读的、稳定的查询接口。
这个过程与数据字典视图(如 DBA_TABLES)加载表定义元数据的过程类似,都是静态信息的展示。
4.2 与 SQL Monitor 基础设施的集成
虽然 V$SQL_MONITOR_STATNAME 本身是静态的,但它与动态的 SQL Monitor 基础设施紧密集成:
- 监控初始化:当一条 SQL 语句开始被监控时,SQL Monitor 会根据
V$SQL_MONITOR_STATNAME中定义的统计信息列表,为每个相关的会话(包括并行服务器进程)创建并初始化一个统计信息计数器数组。数组的索引就是STAT_ID。 - 数据记录:在 SQL 执行过程中,当需要记录统计信息时,监控框架通过
STAT_ID快速定位到数组中对应的计数器并进行更新。 - 数据查询:当用户查询
V$SQL_MONITOR_SESSTAT时,数据库通过连接V$SQL_MONITOR_STATNAME,将存储的STATISTIC#(即STAT_ID)转换为可读的NAME和其他属性返回给用户。
4.3 为什么需要独立的视图?
一个合理的疑问是:既然有 V$STATNAME,为什么还需要 V$SQL_MONITOR_STATNAME?
- 范围聚焦:
V$STATNAME包含超过 1000 个统计项,而 SQL Monitor 只关心其中与 SQL 执行性能最相关的几十个核心指标(如 I/O、CPU 相关)。一个独立的视图明确了 SQL Monitor 的监控范围。 - 性能优化:维护一个独立的、更小的列表,有利于 SQL Monitor 基础设施更高效地进行内存分配和数据管理。
- 功能扩展性:Oracle 可能未来为 SQL Monitor 特有的统计项预留空间,这些项可能不在全局的
V$STATNAME中。
5️⃣ 常用查询 SQL
以下是一些用于探索和理解 SQL 监控统计信息的实用查询。
-
查看 SQL Monitor 支持的所有统计信息及其定义
SELECT stat_id, name, stat_type, stat_desc, display_order FROM v$sql_monitor_statname ORDER BY display_order; -
查找与 I/O 相关的可监控统计信息
SELECT stat_id, name, stat_type FROM v$sql_monitor_statname WHERE name LIKE '%read%' OR name LIKE '%write%' OR name LIKE '%io%' OR name LIKE '%bytes%' ORDER BY name; -
标准用法:关联查询,获取一次SQL执行的可读监控数据
SELECT sm.sql_id, sm.sql_text, smst.name AS resource_type, SUM(sms.value) AS total_consumption FROM v$sql_monitor sm JOIN v$sql_monitor_sesstat sms ON sm.key = sms.key JOIN v$sql_monitor_statname smst ON sms.statistic# = smst.stat_id WHERE sm.sql_id = '&your_sql_id' GROUP BY sm.sql_id, sm.sql_text, smst.name ORDER BY total_consumption DESC; -
检查不同统计信息的类型(Cumulative vs. Gauge)
SELECT stat_type, COUNT(*), LISTAGG(name, ', ') WITHIN GROUP (ORDER BY name) AS example_stats FROM v$sql_monitor_statname GROUP BY stat_type;
6️⃣ 使用场景与总结
6.1 典型使用场景
- 开发自定义监控脚本:当您需要编写脚本从
V$SQL_MONITOR_SESSTAT中提取数据时,必须使用此视图来将数字ID转换为可读的名称,并按需过滤特定类型的统计信息(如只查询物理I/O相关的项)。 - 理解监控报告:当查看
DBMS_SQLTUNE.REPORT_SQL_MONITOR生成的报告时,如果对某些指标有疑问,可以查询此视图来了解其确切定义。 - 研究SQL监控能力:通过查询此视图,可以快速了解Oracle SQL Monitor功能具体在监控哪些方面的性能指标,从而更好地理解其能力边界。
- 元数据查询:某些第三方监控工具或平台可能需要通过此视图来动态发现数据库支持的监控指标。
6.2 重要总结与最佳实践
V$SQL_MONITOR_STATNAME是 SQL 监控数据体系的"解码字典",它本身不包含监控数据,只包含元数据定义。- 它的核心价值在于通过
STAT_ID连接V$SQL_MONITOR_SESSTAT.STATISTIC#,从而将数字转换为可读名称。 - 它是
V$STATNAME的子集,只包含SQL监控相关的统计项。 - 该视图的内容是静态的,由Oracle数据库版本决定,在实例运行期间不会改变。
- 绝大多数情况下,您不需要直接查询此视图,但您通过其他工具(如OEM、SQL监控报告)看到的友好名称,背后都来源于此视图的映射。
通过理解 V$SQL_MONITOR_STATNAME 视图,您将能够完全解读 V$SQL_MONITOR_SESSTAT 中的原始数据,从而能够自主地、灵活地对SQL监控数据进行查询、分析和可视化,摆脱对标准化报告的完全依赖。这是成为SQL性能调优专家的重要一步。
欢迎关注我的公众号《IT小Chen》
13

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



