外观
Oracle 性能监控视图
概述
Oracle 提供了丰富的动态性能视图(Dynamic Performance Views,简称 V$ 视图),用于监控数据库的实时性能状态。这些视图由 Oracle 服务器自动维护,包含了数据库运行时的各种统计信息和性能指标。
会话相关视图
V$SESSION
概述
V$SESSION 视图包含当前数据库中所有会话的详细信息,是监控会话状态和性能的主要视图。
主要列说明
| 列名 | 描述 |
|---|---|
| SID | 会话 ID |
| SERIAL# | 会话序列号,与 SID 一起唯一标识会话 |
| USERNAME | 会话用户名 |
| STATUS | 会话状态(ACTIVE, INACTIVE, KILLED, CACHED, SNIPED) |
| PROGRAM | 客户端程序名 |
| MACHINE | 客户端机器名 |
| OSUSER | 客户端操作系统用户名 |
| SQL_ID | 当前执行的 SQL ID |
| SQL_CHILD_NUMBER | SQL 子游标号 |
| SQL_EXEC_START | SQL 执行开始时间 |
| SQL_EXEC_ID | SQL 执行 ID |
| WAIT_CLASS | 等待事件类别 |
| EVENT | 当前等待事件 |
| WAIT_TIME | 等待时间(毫秒) |
| TIME_WAITED | 累计等待时间 |
| BLOCKING_SESSION | 阻塞当前会话的会话 ID |
| BLOCKING_INSTANCE | 阻塞会话所在实例 ID |
常用查询示例
sql
-- 查看所有活动会话
SELECT sid, serial#, username, status, program, machine, osuser
FROM v$session
WHERE status = 'ACTIVE';
-- 查看等待事件的会话
SELECT sid, serial#, username, wait_class, event, wait_time, time_waited
FROM v$session
WHERE wait_class != 'Idle';
-- 查看阻塞会话
SELECT s1.sid AS waiter_sid, s1.serial# AS waiter_serial,
s1.username AS waiter_user, s1.event AS wait_event,
s2.sid AS blocker_sid, s2.serial# AS blocker_serial,
s2.username AS blocker_user, s2.status AS blocker_status
FROM v$session s1, v$session s2
WHERE s1.blocking_session = s2.sid;
-- 查看会话执行的SQL
SELECT s.sid, s.serial#, s.username, s.program,
q.sql_id, q.sql_text
FROM v$session s
JOIN v$sql q ON s.sql_id = q.sql_id
WHERE s.status = 'ACTIVE';V$SESSION_STATS
概述
V$SESSION_STATS 视图包含每个会话的统计信息,如逻辑读、物理读、执行次数等。
主要列说明
| 列名 | 描述 |
|---|---|
| SID | 会话 ID |
| STATISTIC# | 统计项 ID |
| NAME | 统计项名称 |
| VALUE | 统计项值 |
常用查询示例
sql
-- 查看会话的主要统计信息
SELECT s.sid, s.username, ss.name, ss.value
FROM v$session s
JOIN v$session_stats ss ON s.sid = ss.sid
WHERE s.status = 'ACTIVE'
AND ss.name IN ('session logical reads', 'physical reads', 'physical writes',
'execute count', 'parse count (total)', 'user commits', 'user rollbacks');
-- 查看特定会话的统计信息
SELECT name, value
FROM v$session_stats
WHERE sid = <sid>
ORDER BY value DESC;SQL 相关视图
V$SQL
概述
V$SQL 视图包含库缓存中所有 SQL 语句的详细信息,是分析 SQL 性能的核心视图。
主要列说明
| 列名 | 描述 |
|---|---|
| SQL_ID | SQL 语句唯一标识符 |
| SQL_TEXT | SQL 语句文本 |
| SQL_FULLTEXT | 完整 SQL 语句文本(CLOB 类型) |
| CHILD_NUMBER | 子游标号 |
| PLAN_HASH_VALUE | 执行计划哈希值 |
| ELAPSED_TIME | 累计执行时间(微秒) |
| CPU_TIME | 累计 CPU 时间(微秒) |
| BUFFER_GETS | 累计逻辑读次数 |
| DISK_READS | 累计物理读次数 |
| DIRECT_WRITES | 累计直接写次数 |
| ROWS_PROCESSED | 累计处理的行数 |
| EXECUTIONS | 执行次数 |
| PARSE_CALLS | 解析次数 |
| FIRST_LOAD_TIME | 首次加载时间 |
| LAST_LOAD_TIME | 最后加载时间 |
| LAST_ACTIVE_TIME | 最后活动时间 |
常用查询示例
sql
-- 查看 Top 10 耗时长的 SQL
SELECT * FROM (
SELECT sql_id, elapsed_time/1000000 as elapsed_seconds, cpu_time/1000000 as cpu_seconds,
buffer_gets, disk_reads, executions, sql_text
FROM v$sql
ORDER BY elapsed_time DESC
) WHERE ROWNUM <= 10;
-- 查看 Top 10 逻辑读最多的 SQL
SELECT * FROM (
SELECT sql_id, buffer_gets, disk_reads, executions, buffer_gets/executions as gets_per_exec,
sql_text
FROM v$sql
WHERE executions > 0
ORDER BY buffer_gets DESC
) WHERE ROWNUM <= 10;
-- 查看特定 SQL 的详细信息
SELECT sql_id, plan_hash_value, elapsed_time, cpu_time, buffer_gets, disk_reads,
rows_processed, executions, sql_fulltext
FROM v$sql
WHERE sql_id = '<sql_id>';V$SQLSTATS
概述
V$SQLSTATS 是 V$SQL 的简化版本,包含了最常用的 SQL 统计信息,查询性能更好。
主要列说明
| 列名 | 描述 |
|---|---|
| SQL_ID | SQL 语句唯一标识符 |
| SQL_TEXT | SQL 语句文本 |
| PLAN_HASH_VALUE | 执行计划哈希值 |
| ELAPSED_TIME | 累计执行时间 |
| CPU_TIME | 累计 CPU 时间 |
| BUFFER_GETS | 累计逻辑读次数 |
| DISK_READS | 累计物理读次数 |
| ROWS_PROCESSED | 累计处理的行数 |
| EXECUTIONS | 执行次数 |
| FIRST_LOAD_TIME | 首次加载时间 |
常用查询示例
sql
-- 查看 Top 10 执行次数最多的 SQL
SELECT * FROM (
SELECT sql_id, executions, rows_processed, rows_processed/executions as rows_per_exec,
sql_text
FROM v$sqlstats
WHERE executions > 0
ORDER BY executions DESC
) WHERE ROWNUM <= 10;V$SQL_PLAN
概述
V$SQL_PLAN 视图包含 SQL 语句的执行计划信息。
主要列说明
| 列名 | 描述 |
|---|---|
| SQL_ID | SQL 语句唯一标识符 |
| PLAN_HASH_VALUE | 执行计划哈希值 |
| CHILD_NUMBER | 子游标号 |
| ID | 执行计划步骤 ID |
| PARENT_ID | 父步骤 ID |
| OPERATION | 操作类型 |
| OPTIONS | 操作选项 |
| OBJECT_NAME | 对象名 |
| OPTIMIZER | 优化器模式 |
| COST | 优化器成本 |
| CARDINALITY | 基数估计 |
| BYTES | 字节估计 |
| TIME | 时间估计 |
常用查询示例
sql
-- 查看 SQL 的执行计划
SELECT * FROM v$sql_plan
WHERE sql_id = '<sql_id>'
AND plan_hash_value = <plan_hash_value>
ORDER BY id;
-- 使用 DBMS_XPLAN 查看格式化的执行计划
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR('<sql_id>', <child_number>));系统统计视图
V$SYSSTAT
概述
V$SYSSTAT 视图包含数据库级别的系统统计信息,如逻辑读、物理读、执行次数等。
主要列说明
| 列名 | 描述 |
|---|---|
| STATISTIC# | 统计项 ID |
| NAME | 统计项名称 |
| CLASS | 统计项类别 |
| VALUE | 统计项值 |
| STAT_ID | 统计项唯一 ID |
常用查询示例
sql
-- 查看数据库主要统计信息
SELECT name, value
FROM v$sysstat
WHERE name IN ('session logical reads', 'physical reads', 'physical writes',
'execute count', 'parse count (total)', 'user commits', 'user rollbacks',
'table scans (long tables)', 'table scans (short tables)',
'index fast full scans', 'index range scans');
-- 查看解析相关统计
SELECT name, value
FROM v$sysstat
WHERE name LIKE 'parse%';V$SYSTEM_EVENT
概述
V$SYSTEM_EVENT 视图包含系统级别的等待事件统计信息。
主要列说明
| 列名 | 描述 |
|---|---|
| EVENT | 等待事件名称 |
| WAIT_CLASS | 等待事件类别 |
| TOTAL_WAITS | 总等待次数 |
| TIME_WAITED | 总等待时间(百分之一秒) |
| AVERAGE_WAIT | 平均等待时间 |
| TIME_WAITED_MICRO | 总等待时间(微秒) |
| AVERAGE_WAIT_MICRO | 平均等待时间(微秒) |
常用查询示例
sql
-- 查看系统级等待事件
SELECT event, wait_class, total_waits, time_waited, average_wait
FROM v$system_event
WHERE wait_class != 'Idle'
ORDER BY time_waited DESC;
-- 查看具体等待类别的等待事件
SELECT event, total_waits, time_waited, average_wait
FROM v$system_event
WHERE wait_class = 'User I/O'
ORDER BY time_waited DESC;V$WAITSTAT
概述
V$WAITSTAT 视图包含数据块等待的统计信息,按块类型分类。
主要列说明
| 列名 | 描述 |
|---|---|
| CLASS | 块类型 |
| WAITS | 等待次数 |
| TIME | 等待时间(百分之一秒) |
常用查询示例
sql
-- 查看数据块等待统计
SELECT class, waits, time
FROM v$waitstat
ORDER BY time DESC;内存相关视图
V$SGASTAT
概述
V$SGASTAT 视图包含 SGA(系统全局区)各组件的内存使用情况。
主要列说明
| 列名 | 描述 |
|---|---|
| POOL | 内存池名称 |
| NAME | 内存组件名称 |
| BYTES | 字节数 |
常用查询示例
sql
-- 查看 SGA 内存使用情况
SELECT pool, name, bytes/1024/1024 as size_mb
FROM v$sgastat
ORDER BY pool, bytes DESC;
-- 查看共享池使用情况
SELECT name, bytes/1024/1024 as size_mb
FROM v$sgastat
WHERE pool = 'shared pool'
ORDER BY bytes DESC;
-- 查看缓冲区高速缓存使用情况
SELECT name, bytes/1024/1024 as size_mb
FROM v$sgastat
WHERE pool = 'default pool' OR pool IS NULL
ORDER BY bytes DESC;V$BUFFER_POOL_STATISTICS
概述
V$BUFFER_POOL_STATISTICS 视图包含缓冲区高速缓存的统计信息。
主要列说明
| 列名 | 描述 |
|---|---|
| ID | 缓冲区池 ID |
| NAME | 缓冲区池名称 |
| BLOCK_SIZE | 块大小 |
| BUFFERS | 缓冲区数量 |
| FREE_BUFFERS | 空闲缓冲区数量 |
| DIRTY_BUFFERS | 脏缓冲区数量 |
| DB_BLOCK_GETS | 数据库块获取次数 |
| CONSISTENT_GETS | 一致性获取次数 |
| PHYSICAL_READS | 物理读次数 |
| PHYSICAL_WRITES | 物理写次数 |
| BUFFER_HIT_RATIO | 缓冲区命中率 |
常用查询示例
sql
-- 查看缓冲区池统计信息
SELECT name, block_size, buffers, free_buffers, dirty_buffers,
db_block_gets, consistent_gets, physical_reads, physical_writes,
buffer_hit_ratio
FROM v$buffer_pool_statistics;
-- 计算缓冲区命中率
SELECT name,
1 - (physical_reads / (db_block_gets + consistent_gets)) as hit_ratio
FROM v$buffer_pool_statistics
WHERE (db_block_gets + consistent_gets) > 0;I/O 相关视图
V$DATAFILE
概述
V$DATAFILE 视图包含数据文件的详细信息。
主要列说明
| 列名 | 描述 |
|---|---|
| FILE# | 数据文件 ID |
| NAME | 数据文件路径 |
| STATUS | 数据文件状态 |
| ENABLED | 日志模式 |
| BYTES | 数据文件大小(字节) |
| BLOCKS | 数据文件块数 |
| CREATE_BYTES | 创建时大小(字节) |
| BLOCK_SIZE | 块大小 |
常用查询示例
sql
-- 查看所有数据文件信息
SELECT file#, name, status, enabled, bytes/1024/1024 as size_mb, blocks, block_size
FROM v$datafile;
-- 查看特定表空间的数据文件
SELECT df.file#, df.name, df.bytes/1024/1024 as size_mb
FROM v$datafile df
JOIN v$tablespace ts ON df.ts# = ts.ts#
WHERE ts.name = '<tablespace_name>';V$FILESTAT
概述
V$FILESTAT 视图包含数据文件的 I/O 统计信息。
主要列说明
| 列名 | 描述 |
|---|---|
| FILE# | 数据文件 ID |
| PHYRDS | 物理读次数 |
| PHYWRTS | 物理写次数 |
| READTIM | 物理读时间(百分之一秒) |
| WRITETIM | 物理写时间(百分之一秒) |
| SINGLEBLKRDS | 单块读次数 |
| SINGLEBLKWTS | 单块写次数 |
常用查询示例
sql
-- 查看数据文件 I/O 统计
SELECT df.file#, df.name, fs.phyrds, fs.phywrts, fs.readtim, fs.writetim,
fs.phyrds + fs.phywrts as total_io,
fs.readtim + fs.writetim as total_time
FROM v$filestat fs
JOIN v$datafile df ON fs.file# = df.file#
ORDER BY total_time DESC;
-- 计算数据文件 I/O 吞吐量
SELECT df.file#, df.name,
(fs.phyrds + fs.phywrts) as total_io,
(fs.readtim + fs.writetim) as total_time_centisec,
CASE WHEN (fs.readtim + fs.writetim) > 0 THEN
(fs.phyrds + fs.phywrts) / (fs.readtim + fs.writetim) * 100
ELSE 0 END as io_per_sec
FROM v$filestat fs
JOIN v$datafile df ON fs.file# = df.file#
ORDER BY io_per_sec DESC;版本差异
Oracle 11g
- 基本的 V$ 视图集,包含核心性能监控功能
- 支持 V$SESSION, V$SQL, V$SYSSTAT 等主要视图
- 有限的等待事件分类
Oracle 12c
- 增强了 V$SESSION 视图,添加了更多等待事件和阻塞信息
- 引入了 V$SQLSTATS 视图,提供更高效的 SQL 统计查询
- 增强了等待事件的分类和描述
- 引入了多租户架构下的视图,如 CDB_* 视图
Oracle 19c
- 增强了 V$SQL 视图,添加了更多 SQL 执行统计
- 改进了 V$SESSION 视图的等待事件信息
- 引入了自动索引相关视图
- 增强了 I/O 统计视图
Oracle 21c
- 增强了云环境下的性能监控视图
- 引入了区块链表相关视图
- 改进了内存管理视图
- 支持更细粒度的性能统计
常见问题
Q: 如何判断数据库的性能瓶颈?
A: 综合分析 V$SESSION、V$SYSTEM_EVENT、V$SQL 等视图,重点关注:
- 高频率的等待事件
- 耗时长的 SQL 语句
- 高逻辑读或物理读的 SQL
- 内存使用情况
- I/O 统计信息
Q: 如何查找消耗资源最多的 SQL?
A: 查询 V$SQL 或 V$SQLSTATS 视图,按 elapsed_time、cpu_time、buffer_gets 或 disk_reads 排序,找出 Top SQL。
Q: 如何监控数据库的缓冲区命中率?
A: 查询 V$BUFFER_POOL_STATISTICS 视图,计算 (1 - physical_reads / (db_block_gets + consistent_gets)) * 100。
Q: 如何查看数据库的 I/O 瓶颈?
A: 分析 V$FILESTAT 视图,查看各数据文件的 I/O 次数和时间,找出 I/O 负载高的数据文件。
Q: 如何监控会话的等待事件?
A: 查询 V$SESSION 视图,关注 WAIT_CLASS、EVENT、WAIT_TIME 和 TIME_WAITED 列。
Q: 如何查看阻塞会话?
A: 查询 V$SESSION 视图,通过 BLOCKING_SESSION 和 BLOCKING_INSTANCE 列识别阻塞关系。
Q: 如何查看 SQL 的执行计划?
A: 使用 V$SQL_PLAN 视图或 DBMS_XPLAN.DISPLAY_CURSOR 函数查看 SQL 的执行计划。
Q: 如何监控共享池使用情况?
A: 查询 V$SGASTAT 视图,查看共享池各组件的内存使用情况。
Q: 如何查看数据库的解析率?
A: 计算 (1 - (parse count (hard) / parse count (total))) * 100,数据来自 V$SYSSTAT 视图。
Q: 如何监控数据库的并发情况?
A: 分析 V$SESSION 视图中的会话数量、状态分布、等待事件等,关注活动会话数和等待事件。
