
🗃️ Oracle 19C V$STATNAME 动态性能视图详解
1. 概述与核心作用
V$STATNAME 是 Oracle 数据库中一个基础而重要的数据字典视图,它充当了性能统计信息的"翻译官"或"目录表"。该视图存储了所有可在 V$SYSSTAT、V$SESSTAT 和 V$MYSTAT 等视图中查询到的性能统计项目的元数据(名称、分类等)。
其核心作用在于:
- 统计信息标识:为每个数字化的统计号(STATISTIC#)提供可读的名称(NAME)和详细描述
- 统计信息分类:通过 CLASS 字段对统计信息进行逻辑分组,便于理解和分析
- 性能监控基础:是所有性能监控和统计信息查询的基础参考视图
- 统计信息映射:连接统计号与可读名称的桥梁
2. 使用场景
- 性能监控与诊断:将数字化的统计号转换为有意义的名称,用于性能分析
- 自定义监控脚本:在编写监控脚本时,通过名称引用特定的统计信息
- 统计信息分类分析:按统计类别(如用户提交、重做日志、缓存命中率等)进行分析
- AWR/Statspack报告解读:帮助理解性能报告中各种统计指标的含义
- 数据库健康检查:识别关键性能指标的变化趋势
3. 字段含义详解
V$STATNAME 视图包含以下字段,清晰地描述了各项统计信息的元数据:
| 字段名称 | 数据类型 | 含义说明 |
|---|---|---|
STATISTIC# | NUMBER | 统计信息的唯一数字标识符。这是在 V$SYSSTAT、V$SESSTAT 等视图中使用的内部编号。 |
NAME | VARCHAR2(64) | 统计信息的英文名称。这是人类可读的标识符,如 ‘db block gets’, ‘consistent gets’, ‘physical reads’ 等。 |
CLASS | NUMBER | 统计信息的类别编码。表示该统计信息所属的功能类别: • 1: 用户提交 • 2: 重做日志 • 4: 锁(Enqueue) • 8: 缓存 • 16: 操作系统 • 32: 并行执行 • 64: 恢复管理 • 128: 远程数据库访问(RAC) • 256: 高级队列(AQ) • 注意:一个统计项可以属于多个类别,CLASS 值是这些类别值的和。 |
STAT_ID | NUMBER | 统计信息的稳定标识符(Oracle 10g及以上)。与 STATISTIC# 不同,STAT_ID 在不同数据库版本间保持稳定,适合用于长期监控脚本。 |
4. 相关视图与基表
相关视图:
V$SYSSTAT:显示实例启动以来的系统级统计信息累计值V$SESSTAT:显示每个会话的统计信息值,需要与V$SESSION和V$STATNAME关联使用V$MYSTAT:显示当前会话的统计信息值V$SYSMETRIC/V$METRICNAME:显示系统度量信息及其名称GV$SYSSTAT/GV$SESSTAT:RAC环境下的全局视图
基表:
V$STATNAME 是基于内存结构的视图,其底层基表是 X$KSUSGIF(或类似的内部X$表),这些表由 Oracle 内核维护,存储了统计信息的元数据定义。
5. 底层原理与工作机制
统计信息框架
Oracle 数据库有一个复杂的性能统计框架:
- 统计信息定义:数据库内部定义了数百个性能统计项,每个都有唯一的 STATISTIC# 和名称
- 统计信息收集:数据库内核在执行过程中实时更新各种统计计数器
- 统计信息存储:统计值存储在内存结构中,通过
V$SYSSTAT、V$SESSTAT等视图暴露 - 元数据管理:
V$STATNAME提供了这些统计信息的元数据(名称、分类等)
类别系统的工作原理
CLASS 字段使用位掩码(bitmask)技术表示统计信息的类别归属:
- 每个类别对应一个二进制位(1, 2, 4, 8, 16, 32, 64, 128, 256…)
- 一个统计项可以属于多个类别,其 CLASS 值是这些类别值的和
- 例如:CLASS = 5 (1 + 4) 表示该统计项同时属于"用户提交"和"锁"类别
数据生命周期
- 持久性:统计信息的定义是持久的,不会因实例重启而改变
- 稳定性:STAT_ID 在不同版本间保持稳定,而 STATISTIC# 可能变化
- 实时性:统计信息的定义在实例运行期间是固定的
6. 常用查询 SQL
1. 查找特定统计信息的编号和类别
SELECT statistic#, name, class, stat_id
FROM v$statname
WHERE name LIKE '%db block%'
OR name LIKE '%consistent%';
2. 按类别查看统计信息
SELECT statistic#, name, class
FROM v$statname
WHERE class = 8 -- 缓存相关统计信息
ORDER BY name;
3. 结合 V$SYSSTAT 查看当前统计值
SELECT sn.name, ss.value
FROM v$sysstat ss, v$statname sn
WHERE ss.statistic# = sn.statistic#
AND sn.name IN ('db block gets', 'consistent gets', 'physical reads')
ORDER BY sn.name;
4. 分析多个类别的统计信息
SELECT statistic#, name, class
FROM v$statname
WHERE BITAND(class, 9) > 0 -- 属于类别1(用户)或8(缓存)的统计信息
ORDER BY class, name;
5. 查看会话级别的统计信息
SELECT sn.name, ss.value
FROM v$sesstat ss, v$statname sn, v$session s
WHERE ss.statistic# = sn.statistic#
AND ss.sid = s.sid
AND s.username = '&username'
AND sn.name LIKE '%CPU%'
ORDER BY sn.name;
6. 使用 STAT_ID 进行稳定查询
SELECT name, statistic#, stat_id
FROM v$statname
WHERE stat_id IN (SELECT stat_id
FROM v$statname
WHERE name IN ('db block gets', 'consistent gets'))
ORDER BY name;
7. 关键知识点与注意事项
重要统计指标
了解一些关键统计指标对于性能分析至关重要:
- db block gets:当前模式块获取次数
- consistent gets:一致性读获取次数
- physical reads:物理读次数
- redo size:重做日志大小
- sorts (memory):内存排序次数
- sorts (disk):磁盘排序次数
- parse count:解析次数
类别解码
理解 CLASS 字段的含义对于统计信息分析很重要:
-- 解码CLASS字段
SELECT statistic#, name, class,
CASE WHEN BITAND(class, 1) > 0 THEN 'User ' END ||
CASE WHEN BITAND(class, 2) > 0 THEN 'Redo ' END ||
CASE WHEN BITAND(class, 4) > 0 THEN 'Enqueue ' END ||
CASE WHEN BITAND(class, 8) > 0 THEN 'Cache ' END ||
CASE WHEN BITAND(class, 16) > 0 THEN 'OS ' END ||
CASE WHEN BITAND(class, 32) > 0 THEN 'Parallel ' END ||
CASE WHEN BITAND(class, 64) > 0 THEN 'Recovery ' END ||
CASE WHEN BITAND(class, 128) > 0 THEN 'RAC ' END ||
CASE WHEN BITAND(class, 256) > 0 THEN 'AQ ' END as class_description
FROM v$statname
WHERE statistic# < 50;
版本兼容性
- STATISTIC#:可能在不同数据库版本间变化,不适合用于长期监控脚本
- STAT_ID:从 Oracle 10g 开始引入,在不同版本间保持稳定,适合用于监控脚本
- 新增统计项:新版本的 Oracle 可能会添加新的统计项
性能考虑
虽然 V$STATNAME 本身很小,但与 V$SESSTAT 等大数据量视图连接时可能影响性能,在生产环境中应谨慎使用复杂的连接查询。
通过深入理解 V$STATNAME 视图,DBA 可以更有效地监控和分析数据库性能,识别瓶颈并进行相应的优化。这个视图是所有性能调优工作的基础,值得深入学习和掌握。
欢迎关注我的公众号《IT小Chen》
942

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



