
Oracle 19C V$SYSSTAT 动态性能视图详解
1 视图概述与核心作用
V$SYSSTAT 是 Oracle 数据库中一个极其重要的动态性能视图,它提供了自数据库实例启动以来各种系统级别的统计信息累计值。这些统计信息涵盖了数据库操作的各个方面,包括 SQL 执行、内存使用、I/O 操作、并发控制、登录登出等,是进行数据库性能分析和调优的基础数据源。
与 V$SYSMETRIC 系列视图不同,V$SYSSTAT 提供的是自实例启动以来的累计值,而不是近期时间间隔内的速率或平均值。要计算某段时间内的活动量,需要采集两个时间点的值并计算差值。
2 字段详解
以下是 V$SYSSTAT 视图包含的字段及其详细含义:
| 字段名称 (Field Name) | 数据类型 | 描述 |
|---|---|---|
| STATISTIC# | NUMBER | 统计信息的唯一数字标识符。这个值在不同版本和实例间可能不一致,因此查询时最好使用名称而非ID。 |
| NAME | VARCHAR2(64) | 统计信息的名称(例如:"session logical reads", "db block gets", "physical reads")。这是最常用的字段。 |
| CLASS | NUMBER | 统计信息的类别标识符。表示该统计信息属于哪个功能类别(如1:User, 2:Redo, 4:Enqueue, 8:Cache, 16:OS等)。 |
| VALUE | NUMBER | 自实例启动以来该统计信息的累计值。这是最核心的数值字段。 |
| STAT_ID | NUMBER | 统计信息的稳定标识符。在不同版本和不同实例中,相同统计信息的此ID通常保持一致,比STATISTIC#更可靠。 |
| CON_ID | NUMBER | 容器ID(Container ID)。在多租户环境(CDB)中,标识该统计信息来源于哪个PDB。值为0表示属于CDB$ROOT。 |
关键字段解读:
CLASS:指示统计信息类别,常用值包括:- 1: User (用户级统计)
- 2: Redo (重做日志相关)
- 4: Enqueue (队列锁)
- 8: Cache (缓冲区缓存)
- 16: OS (操作系统)
- 32: Real Application Clusters (RAC)
- 64: SQL (SQL执行)
- 128: Debug (调试)
VALUE:这是累计值,要分析特定时间段内的活动,需要计算两个时间点的差值:delta = value_end - value_start。STAT_ID:在需要稳定标识符的脚本或监控工具中,使用STAT_ID比STATISTIC#更可靠。
3 底层原理与相关对象
3.1 底层原理
-
内存驻留与更新机制:
V$SYSSTAT的数据存储在系统全局区(SGA) 的固定内存结构中。当数据库进行各种操作时(如执行SQL、读写数据块、生成redo等),相应的后台进程和服务进程会实时更新这些内存位置的计数器。例如,当进程从缓冲区缓存读取一个块时,“session logical reads” 计数器就会增加。 -
累计性:这些计数器从实例启动开始累加,永远不会减少(除非实例重启)。这是它与
V$SYSMETRIC系列视图最根本的区别。 -
持久化:虽然
V$SYSSTAT本身是易失的(实例关闭后数据丢失),但它的数据可以通过多种方式持久化:- AWR快照:MMON进程定期采集
V$SYSSTAT的数据并存储到AWR仓库的基表(如WRH$_SYSSTAT)中。 - Statspack快照:Statspack工具也会采集这些数据。
- 手动查询并保存:DBA可以定期查询并将结果保存到自定义表中。
- AWR快照:MMON进程定期采集
-
基表:同其他
V$视图一样,V$SYSSTAT基于内部的X$表(如X$KCFIS),这些表的结构对用户不透明,不建议直接查询。
3.2 相关视图
| 视图名称 | 描述 |
|---|---|
V$SESSTAT | 提供会话级别的统计信息,结构与 V$SYSSTAT 类似,但多了 SID 字段标识会话。是分析单个会话性能的关键视图。 |
V$MYSTAT | 显示当前会话的统计信息,是 V$SESSTAT 的一个子集,只包含当前登录会话的数据。 |
V$STATNAME | 提供所有统计信息的名称、分类等元数据信息,其 STATISTIC# 字段可与 V$SYSSTAT 和 V$SESSTAT 关联。 |
DBA_HIST_SYSSTAT | AWR快照中保存的 V$SYSSTAT 的历史数据,用于长期性能趋势分析。 |
GV$SYSSTAT | 在RAC环境中,显示所有实例的 V$SYSSTAT 信息。 |
4 主要使用场景
- 实例级性能分析:计算缓冲区缓存命中率、软解析率、各种等待比率等关键性能指标。
- 工作量分析:了解实例启动以来的总工作量,如执行了多少SQL语句、发生了多少逻辑读/物理读、生成了多少redo等。
- 性能监控基线:定期采集数据,建立性能基线,用于后续的性能比较和异常检测。
- 容量规划:根据历史统计数据预测未来的资源需求。
- AWR/Statspack报告的基础:这些性能报告中的许多数据都来源于
V$SYSSTAT及其历史版本。
5 常用SQL查询示例
5.1 查询所有系统统计信息(按值排序)
SELECT statistic#,
name,
class,
value
FROM v$sysstat
ORDER BY value DESC;
5.2 计算缓冲区缓存命中率
这是最经典的性能指标之一,衡量从内存而非磁盘获取数据的效率。
SELECT ROUND(100 * (1 - (phy.value / (cur.value + con.value))), 2) || '%' AS "Buffer Cache Hit Ratio"
FROM v$sysstat cur, v$sysstat con, v$sysstat phy
WHERE cur.name = 'db block gets'
AND con.name = 'consistent gets'
AND phy.name = 'physical reads';
5.3 计算软解析率
衡量SQL执行中重用已有执行计划的比例,高软解析率通常有利于性能。
SELECT ROUND(100 * (1 - (hard.value / (hard.value + soft.value))), 2) || '%' AS "Soft Parse Ratio"
FROM v$sysstat soft, v$sysstat hard
WHERE soft.name = 'parse count (total)'
AND hard.name = 'parse count (hard)';
5.4 查看SQL执行相关的关键统计信息
SELECT name,
value
FROM v$sysstat
WHERE name IN ('execute count',
'parse count (total)',
'parse count (hard)',
'sorts (memory)',
'sorts (disk)')
ORDER BY name;
5.5 计算两个时间点之间的统计信息差值(工作量分析)
需要先保存一个起始点的数据到临时表或变量中,然后与当前值比较。
-- 第一步:保存起始值(例如保存到临时表)
CREATE GLOBAL TEMPORARY TABLE sysstat_start AS
SELECT statistic#, name, value
FROM v$sysstat
WHERE name IN ('session logical reads',
'db block gets',
'consistent gets',
'physical reads',
'redo size');
-- 第二步:经过一段时间后,计算差值
SELECT s.name,
s.value - t.value AS delta_value
FROM v$sysstat s,
sysstat_start t
WHERE s.statistic# = t.statistic#
ORDER BY delta_value DESC;
-- 第三步:清理临时表
TRUNCATE TABLE sysstat_start;
DROP TABLE sysstat_start;
6 重要统计信息解读
以下是一些关键的系统统计信息及其含义:
| 统计信息名称 | 描述 |
|---|---|
| session logical reads | 会话逻辑读:所有会话从缓冲区缓存中读取数据块的总次数。这是衡量数据库工作量的一个重要指标。 |
| db block gets | 当前模式获取:以当前模式(用于DML操作)获取数据块的次数。 |
| consistent gets | 一致性获取:以一致性模式(用于查询)获取数据块的次数。 |
| physical reads | 物理读:从磁盘读取数据块的次数。物理读通常比逻辑读慢得多。 |
| redo size | 重做日志大小:生成的redo数据量(以字节为单位)。衡量数据库变更活动的指标。 |
| parse count (total) | 总解析次数:SQL解析的总次数(包括软解析和硬解析)。 |
| parse count (hard) | 硬解析次数:需要完全解析SQL语句的次数。硬解析消耗大量资源,应尽量减少。 |
| execute count | 执行次数:SQL语句执行的总次数。 |
| sorts (memory) | 内存排序:在内存中完成的排序操作次数。 |
| sorts (disk) | 磁盘排序:需要使用临时表空间磁盘段的排序操作次数。磁盘排序比内存排序慢得多,应尽量减少。 |
| user commits | 用户提交:用户提交事务的次数。 |
| user rollbacks | 用户回滚:用户回滚事务的次数。 |
| logons cumulative | 累计登录数:自实例启动以来的总登录次数。 |
| DB time | 数据库时间:在数据库调用中花费的总时间(以厘秒为单位)。这是极其重要的性能指标。 |
| DB CPU | 数据库CPU时间:在数据库调用中花费的CPU时间(以厘秒为单位)。 |
7 重要知识点总结
- 累计性:
V$SYSSTAT的值是自实例启动以来的累计值,要分析特定时间段内的活动,必须计算两个时间点的差值。 - 性能指标计算:许多重要的性能指标(如缓存命中率、软解析率)需要通过多个统计信息计算得出,而不是直接查询单个值。
- 实例范围:
V$SYSSTAT提供的是实例级别的统计信息,要查看会话级别信息,需要使用V$SESSTAT或V$MYSTAT。 - 多租户支持:在CDB环境中,可以通过
CON_ID字段筛选特定PDB的统计信息,或者连接到目标PDB中直接查询。 - 监控与基线:定期收集
V$SYSSTAT数据并建立性能基线,是有效数据库性能管理的关键实践。 - 历史分析:对于长期性能趋势分析,应使用
DBA_HIST_SYSSTAT(AWR历史数据)而非直接查询V$SYSSTAT。
V$SYSSTAT 是Oracle数据库性能监控和调优的基石视图,掌握其用法对于任何希望深入了解数据库性能的DBA或开发人员都至关重要。
欢迎关注我的公众号《IT小Chen》
Oracle V$SYSSTAT动态视图详解
191

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



