Skip to content

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_NUMBERSQL 子游标号
SQL_EXEC_STARTSQL 执行开始时间
SQL_EXEC_IDSQL 执行 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_IDSQL 语句唯一标识符
SQL_TEXTSQL 语句文本
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_IDSQL 语句唯一标识符
SQL_TEXTSQL 语句文本
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_IDSQL 语句唯一标识符
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 视图中的会话数量、状态分布、等待事件等,关注活动会话数和等待事件。