Skip to content

Oracle 内置视图与动态性能视图

动态性能视图概述

Oracle 动态性能视图(Dynamic Performance Views,简称 V$ 视图)是 Oracle 数据库提供的一组实时监控和诊断工具,用于获取数据库运行时的状态信息、性能指标和内部结构数据。这些视图由 Oracle 服务器自动维护,反映了数据库实例的当前状态。

动态性能视图的特点

  • 实时性:视图中的数据实时反映数据库当前状态
  • 动态性:数据随数据库运行状态变化而变化
  • 只读性:用户只能查询,不能修改
  • 实例级:每个实例有自己独立的 V$ 视图数据
  • 内存存储:大部分数据存储在内存中,少量从磁盘读取

动态性能视图的作用

  • 监控数据库性能和资源使用情况
  • 诊断数据库问题和故障
  • 优化 SQL 语句和数据库配置
  • 分析数据库内部结构和运行机制
  • 生成性能报告和统计信息

动态性能视图的分类

Oracle 动态性能视图可以分为以下几类:

1. 实例和会话相关视图

  • V$INSTANCE:显示实例的基本信息和状态
  • V$SESSION:显示当前所有会话的详细信息
  • V$SESSTAT:显示每个会话的统计信息
  • V$TRANSACTION:显示当前所有事务的详细信息

2. 内存相关视图

  • V$SGA:显示 SGA 的大小和组成
  • V$SGASTAT:显示 SGA 各个组件的详细统计信息
  • V$PGASTAT:显示 PGA 的使用统计信息
  • V$BUFFER_POOL:显示缓冲区池的配置和使用情况

3. 性能相关视图

  • V$SQL:显示 SQL 语句的执行计划和统计信息
  • V$SQLSTATS:显示 SQL 语句的汇总统计信息
  • V$SYSSTAT:显示系统级的统计信息
  • V$WAITSTAT:显示等待事件的统计信息

4. I/O 相关视图

  • V$FILESTAT:显示数据文件的 I/O 统计信息
  • V$IOSTAT_FILE:显示更详细的文件 I/O 统计信息
  • V$DISKSTAT:显示磁盘的 I/O 统计信息

5. 日志相关视图

  • V$LOG:显示重做日志文件的信息
  • V$LOGFILE:显示重做日志文件的物理位置
  • V$ARCHIVED_LOG:显示已归档的日志文件信息
  • V$LOG_HISTORY:显示重做日志切换历史

6. 锁和等待事件视图

  • V$LOCK:显示当前持有或请求的锁信息
  • V$SESSION_WAIT:显示会话当前等待的事件
  • V$SESSION_EVENT:显示会话的等待事件历史
  • V$EVENT_NAME:显示所有等待事件的名称和描述

7. AWR 和 ASH 相关视图

  • V$ACTIVE_SESSION_HISTORY:显示活动会话的历史信息
  • DBA_HIST_SNAPSHOT:显示 AWR 快照的信息
  • DBA_HIST_SYSMETRIC_HISTORY:显示系统指标的历史信息

常用动态性能视图详解

1. V$INSTANCE

显示 Oracle 实例的基本信息和状态,是监控实例健康状况的首选视图。

主要字段

  • INSTANCE_NUMBER:实例编号
  • INSTANCE_NAME:实例名称
  • HOST_NAME:主机名
  • VERSION:Oracle 版本
  • STARTUP_TIME:实例启动时间
  • STATUS:实例状态(STARTED, MOUNTED, OPEN)
  • DATABASE_STATUS:数据库状态
  • ARCHIVER:归档模式状态

使用示例

sql
SELECT INSTANCE_NAME, STATUS, DATABASE_STATUS, STARTUP_TIME, VERSION
FROM V$INSTANCE;

2. V$SESSION

显示当前所有数据库会话的详细信息,包括会话状态、用户、程序、等待事件等。

主要字段

  • SID:会话 ID
  • SERIAL#:会话序列号
  • USERNAME:用户名
  • STATUS:会话状态(ACTIVE, INACTIVE, KILLED)
  • PROGRAM:客户端程序
  • MACHINE:客户端主机名
  • OSUSER:操作系统用户名
  • SQL_ID:当前执行的 SQL ID
  • EVENT:当前等待事件
  • WAIT_TIME:等待时间

使用示例

sql
-- 查询活动会话
SELECT SID, SERIAL#, USERNAME, PROGRAM, EVENT, WAIT_TIME
FROM V$SESSION WHERE STATUS = 'ACTIVE';

-- 查询特定用户的会话
SELECT SID, SERIAL#, STATUS, SQL_ID FROM V$SESSION WHERE USERNAME = 'SCOTT';

3. V$SQL

显示 SQL 语句的执行计划和统计信息,用于 SQL 性能分析和优化。

主要字段

  • SQL_ID:SQL 语句的唯一标识
  • SQL_TEXT:SQL 语句文本
  • ELAPSED_TIME:总执行时间
  • EXECUTIONS:执行次数
  • BUFFER_GETS:逻辑读次数
  • DISK_READS:物理读次数
  • ROWS_PROCESSED:处理的行数
  • OPTIMIZER_COST:优化器成本

使用示例

sql
-- 查询执行时间最长的 SQL
SELECT SQL_ID, SQL_TEXT, ELAPSED_TIME/1000000 AS ELAPSED_SECONDS, EXECUTIONS
FROM V$SQL ORDER BY ELAPSED_TIME DESC;

-- 查询 IO 消耗最大的 SQL
SELECT SQL_ID, SQL_TEXT, DISK_READS, BUFFER_GETS FROM V$SQL ORDER BY DISK_READS DESC;

4. V$SYSSTAT

显示系统级的统计信息,包括 CPU 使用、I/O 操作、事务处理等。

主要字段

  • STATISTIC#:统计项编号
  • NAME:统计项名称
  • VALUE:统计值

常用统计项

  • CPU used by this session:会话使用的 CPU 时间
  • db block gets:当前模式块读取次数
  • consistent gets:一致模式块读取次数
  • physical reads:物理读次数
  • physical writes:物理写次数
  • user commits:用户提交次数
  • user rollbacks:用户回滚次数

使用示例

sql
-- 查询主要系统统计信息
SELECT NAME, VALUE FROM V$SYSSTAT
WHERE NAME IN ('CPU used by this session', 'db block gets', 'consistent gets',
               'physical reads', 'physical writes', 'user commits', 'user rollbacks');

5. V$SESSION_WAIT

显示会话当前等待的事件,用于诊断性能瓶颈。

主要字段

  • SID:会话 ID
  • EVENT:等待事件名称
  • WAIT_TIME:等待时间
  • SECONDS_IN_WAIT:等待的秒数
  • STATE:等待状态(WAITING, WAITED SHORT TIME, WAITED UNKNOWN TIME)

使用示例

sql
-- 查询当前等待事件
SELECT EVENT, COUNT(*) FROM V$SESSION_WAIT GROUP BY EVENT ORDER BY COUNT(*) DESC;

-- 查询特定会话的等待事件
SELECT SID, EVENT, SECONDS_IN_WAIT, STATE FROM V$SESSION_WAIT WHERE SID = 123;

6. V$FILESTAT

显示数据文件的 I/O 统计信息,用于分析磁盘 I/O 性能。

主要字段

  • FILE#:数据文件编号
  • PHYBLKREAD:物理块读取次数
  • PHYBLKWRT:物理块写入次数
  • READTIM:读取时间(百分之一秒)
  • WRITETIM:写入时间(百分之一秒)

使用示例

sql
-- 查询 I/O 最频繁的数据文件
SELECT f.FILE#, f.NAME, s.PHYBLKREAD, s.PHYBLKWRT
FROM V$FILESTAT s, V$DATAFILE f
WHERE s.FILE# = f.FILE# ORDER BY s.PHYBLKREAD + s.PHYBLKWRT DESC;

-- 计算每个数据文件的平均读取时间
SELECT f.FILE#, f.NAME, s.PHYBLKREAD, s.READTIM,
       ROUND(s.READTIM / NULLIF(s.PHYBLKREAD, 0), 2) AS AVG_READ_TIME
FROM V$FILESTAT s, V$DATAFILE f
WHERE s.FILE# = f.FILE# AND s.PHYBLKREAD > 0;

19c 和 21c 动态性能视图差异

新增视图

Oracle 21c 新增的动态性能视图

视图名称描述
V$SQL_PLAN_STATISTICS_ALL显示 SQL 执行计划的详细统计信息
V$SQL_BIND_CAPTURE增强的绑定变量捕获视图
V$AUTO_INDEX自动索引相关信息
V$AUTO_INDEX_CONFIG自动索引配置信息
V$AUTO_INDEX_STATS自动索引统计信息
V$DB_TRANSPORTABLE_PLATFORM可传输表空间平台信息
V$ENCRYPTION_WALLET加密钱包状态信息

增强视图

Oracle 21c 增强的动态性能视图

视图名称增强内容
V$SESSION新增 SQL_EXEC_START 字段,显示 SQL 执行开始时间
V$SQL新增 SQL_PATCHES 字段,显示应用的 SQL 补丁
V$SQLSTATS增强统计信息,包括更多执行计划相关字段
V$BUFFER_POOL_STATISTICS新增 DB_BLOCK_CHANGES 字段,显示块修改次数
V$ACTIVE_SESSION_HISTORY支持更长的历史记录,增强查询性能

视图行为变化

  • V$SQL:21c 中默认不显示绑定变量值,需要设置 STATISTICS_LEVEL=ALL
  • V$SESSION:21c 中 PROGRAM 字段显示更详细的客户端信息
  • V$LOCK:21c 中锁等待检测更灵敏,减少假阳性

生产环境最佳实践

1. 合理权限管理

  • 只授予 DBA 或监控用户访问 V$ 视图的权限
  • 使用角色(如 SELECT_CATALOG_ROLE)管理权限,避免直接授予系统权限
  • 定期审查 V$ 视图的访问权限

2. 高效查询 V$ 视图

  • 只查询需要的字段,避免 SELECT *
  • 使用 WHERE 子句过滤数据,减少返回结果集
  • 避免频繁查询高开销视图(如 V$ACTIVE_SESSION_HISTORY)
  • 考虑使用 ASH 或 AWR 替代实时查询,减少系统负载

3. 结合多个视图分析问题

  • 结合 V$SESSION 和 V$SQL 分析会话执行的 SQL
  • 结合 V$LOCK 和 V$SESSION 分析锁等待问题
  • 结合 V$FILESTAT 和 V$DATAFILE 分析 I/O 瓶颈
  • 结合 V$SYSSTAT 和 V$SESSTAT 分析系统和会话性能

4. 监控关键指标

  • 定期监控 V$INSTANCE 确保实例正常运行
  • 监控 V$SESSION 中的活动会话数和等待事件
  • 监控 V$SQL 中的慢 SQL 和高资源消耗 SQL
  • 监控 V$SYSSTAT 中的关键统计指标

5. 使用视图生成报告

  • 基于 V$ 视图编写自定义监控脚本
  • 生成定期性能报告,分析趋势
  • 结合 AWR/ASH 报告深入分析性能问题

6. 19c/21c 版本差异处理

  • 注意不同版本间视图字段的变化
  • 对于跨版本部署,使用兼容性视图
  • 利用 21c 新增视图增强监控能力

内置静态视图

除了动态性能视图,Oracle 还提供了大量静态视图,用于存储数据库的元数据和配置信息。

常用静态视图

  • DBA_USERS:显示数据库用户信息
  • DBA_TABLES:显示数据库表信息
  • DBA_INDEXES:显示数据库索引信息
  • DBA_TABLESPACES:显示表空间信息
  • DBA_DATA_FILES:显示数据文件信息
  • DBA_FREE_SPACE:显示表空间空闲空间信息
  • DBA_ROLES:显示角色信息
  • DBA_SYS_PRIVS:显示系统权限信息
  • DBA_TAB_PRIVS:显示对象权限信息

静态视图与动态视图的区别

特性静态视图动态视图
数据来源数据字典(磁盘)内存和控制结构
数据更新DDL 或配置变更时实时更新
主要用途元数据查询性能监控和诊断
命名规则DBA_, ALL_, USER_*V$, GV$
权限需求SELECT_CATALOG_ROLESELECT ANY DICTIONARY

动态性能视图的访问权限

授权方式

  1. 直接授予系统权限

    sql
    GRANT SELECT ANY DICTIONARY TO username;
  2. 授予角色

    sql
    GRANT SELECT_CATALOG_ROLE TO username;
  3. 授予特定视图权限

    sql
    GRANT SELECT ON V$INSTANCE TO username;
    GRANT SELECT ON V$SESSION TO username;

最佳授权实践

  • 对于普通用户,只授予必要的特定视图权限
  • 对于监控用户,授予 SELECT_CATALOG_ROLE 角色
  • 对于 DBA,授予 SELECT ANY DICTIONARY 系统权限
  • 定期审查和回收不必要的权限

常见问题(FAQ)

Q: 如何区分动态性能视图和静态视图?

A: 主要通过命名规则区分:

  • 动态性能视图:以 V$ 或 GV$ 开头(GV$ 是 RAC 环境下的全局视图)
  • 静态视图:以 DBA_、ALL_ 或 USER_* 开头

Q: 为什么有些 V$ 视图查询返回空结果?

A: 可能的原因:

  1. 权限不足,需要授予相应权限
  2. 视图数据在内存中,实例重启后数据重置
  3. 某些视图只在特定条件下有数据(如 V$TRANSACTION 只在有活动事务时)
  4. 某些视图在不同版本间行为变化

Q: 如何减少查询 V$ 视图对系统性能的影响?

A: 可以通过以下方式减少影响:

  1. 只查询需要的字段,避免 SELECT *
  2. 使用 WHERE 子句过滤数据
  3. 减少查询频率,特别是高开销视图
  4. 考虑使用 AWR/ASH 报告替代实时查询
  5. 在非高峰时段执行复杂查询

Q: 如何监控长时间运行的 SQL?

A: 可以通过以下方式:

  1. 查询 V$SESSION 视图,过滤 STATUS='ACTIVE' 的会话
  2. 结合 V$SQL 视图,查看 SQL 执行时间
  3. 使用 V$SQL_MONITOR 视图(需要 11g 以上版本)
  4. 配置 AWR 报告,分析 SQL 执行历史

Q: 如何分析锁等待问题?

A: 可以通过以下步骤:

  1. 查询 V$LOCK 视图,识别锁持有者和请求者
  2. 结合 V$SESSION 视图,查看会话信息
  3. 查询 V$SESSION_WAIT 视图,确认等待事件
  4. 必要时终止阻塞会话(使用 ALTER SYSTEM KILL SESSION)

Q: 19c 和 21c 中 V$SQL 视图有什么变化?

A: 主要变化:

  1. 21c 中新增 SQL_PATCHES 字段,显示应用的 SQL 补丁
  2. 21c 中默认不显示绑定变量值,需要设置 STATISTICS_LEVEL=ALL
  3. 21c 中增强了执行计划统计信息

总结

Oracle 动态性能视图是 DBA 监控、诊断和优化数据库的重要工具。通过合理使用这些视图,可以实时了解数据库运行状态,快速定位性能瓶颈,有效解决各种数据库问题。

在使用动态性能视图时,需要注意:

  • 合理管理访问权限,确保数据安全
  • 高效查询视图,减少系统负载
  • 结合多个视图进行综合分析
  • 注意不同版本间的视图差异
  • 遵循最佳实践,提高监控效率

随着 Oracle 版本的不断更新,动态性能视图也在不断增强和完善,特别是 21c 版本新增了许多有用的视图和字段,为 DBA 提供了更强大的监控和诊断能力。理解和掌握这些视图,对于维护 Oracle 数据库的稳定性和性能至关重要。