外观
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:会话 IDSERIAL#:会话序列号USERNAME:用户名STATUS:会话状态(ACTIVE, INACTIVE, KILLED)PROGRAM:客户端程序MACHINE:客户端主机名OSUSER:操作系统用户名SQL_ID:当前执行的 SQL IDEVENT:当前等待事件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:会话 IDEVENT:等待事件名称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_ROLE | SELECT ANY DICTIONARY |
动态性能视图的访问权限
授权方式
直接授予系统权限:
sqlGRANT SELECT ANY DICTIONARY TO username;授予角色:
sqlGRANT SELECT_CATALOG_ROLE TO username;授予特定视图权限:
sqlGRANT 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: 可能的原因:
- 权限不足,需要授予相应权限
- 视图数据在内存中,实例重启后数据重置
- 某些视图只在特定条件下有数据(如 V$TRANSACTION 只在有活动事务时)
- 某些视图在不同版本间行为变化
Q: 如何减少查询 V$ 视图对系统性能的影响?
A: 可以通过以下方式减少影响:
- 只查询需要的字段,避免 SELECT *
- 使用 WHERE 子句过滤数据
- 减少查询频率,特别是高开销视图
- 考虑使用 AWR/ASH 报告替代实时查询
- 在非高峰时段执行复杂查询
Q: 如何监控长时间运行的 SQL?
A: 可以通过以下方式:
- 查询 V$SESSION 视图,过滤
STATUS='ACTIVE'的会话 - 结合 V$SQL 视图,查看 SQL 执行时间
- 使用 V$SQL_MONITOR 视图(需要 11g 以上版本)
- 配置 AWR 报告,分析 SQL 执行历史
Q: 如何分析锁等待问题?
A: 可以通过以下步骤:
- 查询 V$LOCK 视图,识别锁持有者和请求者
- 结合 V$SESSION 视图,查看会话信息
- 查询 V$SESSION_WAIT 视图,确认等待事件
- 必要时终止阻塞会话(使用 ALTER SYSTEM KILL SESSION)
Q: 19c 和 21c 中 V$SQL 视图有什么变化?
A: 主要变化:
- 21c 中新增
SQL_PATCHES字段,显示应用的 SQL 补丁 - 21c 中默认不显示绑定变量值,需要设置
STATISTICS_LEVEL=ALL - 21c 中增强了执行计划统计信息
总结
Oracle 动态性能视图是 DBA 监控、诊断和优化数据库的重要工具。通过合理使用这些视图,可以实时了解数据库运行状态,快速定位性能瓶颈,有效解决各种数据库问题。
在使用动态性能视图时,需要注意:
- 合理管理访问权限,确保数据安全
- 高效查询视图,减少系统负载
- 结合多个视图进行综合分析
- 注意不同版本间的视图差异
- 遵循最佳实践,提高监控效率
随着 Oracle 版本的不断更新,动态性能视图也在不断增强和完善,特别是 21c 版本新增了许多有用的视图和字段,为 DBA 提供了更强大的监控和诊断能力。理解和掌握这些视图,对于维护 Oracle 数据库的稳定性和性能至关重要。
