本文档风哥主要介绍Oracle数据库动态性能视图相关知识,包括Oracle数据库动态性能视图的概念、Oracle数据库常用V$视图、Oracle数据库动态性能视图查询、Oracle数据库性能监控、Oracle数据库性能诊断等内容,由风哥教程参考Oracle官方文档Performance内容编写,适合DBA人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。
Part01-基础概念与理论知识
1.1 Oracle数据库动态性能视图的概念
Oracle数据库动态性能视图(Dynamic Performance
Views)是以V$开头的一组特殊视图,用于提供数据库的实时性能信息。这些视图基于Oracle实例的内存结构,提供关于会话、SQL执行、锁、等待事件、I/O等方面的实时信息。动态性能视图是性能监控和故障诊断的重要工具。更多视频教程www.fgedu.net.cn
- 实时数据:基于内存,数据不断更新
- 实例级:数据在实例重启后重置
- 需要特殊权限:SELECT_CATALOG_ROLE角色
- V$视图:单实例视图
- GV$视图:RAC全局视图
1.2 Oracle数据库动态性能视图类型
Oracle数据库动态性能视图类型:
- 会话相关:V$SESSION、V$SESSION_WAIT、V$SESSION_EVENT等
- SQL相关:V$SQL、V$SQLAREA、V$SQLTEXT、V$SQL_PLAN等
- 锁和等待:V$LOCK、V$LATCH、V$WAITSTAT等
- 存储相关:V$DATAFILE、V$TABLESPACE、V$LOG等
- 系统统计:V$SYSSTAT、V$SESSTAT、V$MYSTAT等
- 内存相关:V$SGA、V$PGA、V$BUFFER_POOL等
1.3 Oracle数据库动态性能视图特点
Oracle数据库动态性能视图特点:
- 实时性:数据来自内存,实时更新
- 临时性:实例重启后数据重置
- 累积性:部分统计数据是累积的
- 权限要求:需要SELECT_CATALOG_ROLE或SELECT ANY DICTIONARY
- 广泛用途:性能监控、故障诊断、优化分析
Part02-生产环境规划与建议
2.1 Oracle数据库动态性能视图使用场景
Oracle数据库动态性能视图使用场景:
– 查看当前活跃会话
– 查看当前等待事件
– 查看Top SQL
– 查看锁和阻塞
# 性能诊断场景
– 分析性能瓶颈
– 分析SQL执行情况
– 分析I/O性能
– 分析内存使用
# 故障排查场景
– 查找阻塞会话
– 查找长时间运行SQL
– 查找资源争用
– 查找错误原因
# 容量规划场景
– 分析历史趋势
– 分析资源使用
– 分析增长趋势
– 预测未来需求
2.2 Oracle数据库动态性能视图查询优化
Oracle数据库动态性能视图查询优化建议:
– 使用WHERE条件过滤
– 避免全表扫描
– 使用适当的列
– 避免在高峰期频繁查询
– 使用绑定变量
– 注意查询频率
# 常用优化技巧
– 使用ROWNUM或FETCH FIRST限制结果
– 避免使用SELECT *
– 定期收集统计信息
– 使用并行查询(大数据量)
– 考虑使用AWR代替实时查询
2.3 Oracle数据库性能监控策略
Oracle数据库性能监控策略:
- 实时监控:使用V$视图进行实时监控
- 历史分析:使用AWR进行历史分析
- 告警设置:设置关键指标告警
- 趋势分析:定期分析性能趋势
- 报告生成:定期生成性能报告
Part03-生产环境项目实施方案
3.1 Oracle数据库会话相关视图
3.1.1 Oracle数据库会话查询
SQL> select
sid,
serial#,
username,
status,
program,
machine,
to_char(logon_time, ‘YYYY-MM-DD HH24:MI:SS’) as logon_time
from v$session
where username is not null
order by username;SID SERIAL# USERNAME STATUS PROGRAM MACHINE LOGON_TIME
———- ———- ———- ——– ——————————– —————— ——————-
123 45678 FGEDU ACTIVE sqlplus@fgedu.net.cn fgedu.net.cn 2026-03-31 09:00:00
124 45679 SYS INACTIVE oracle@fgedu.net.cn fgedu.net.cn 2026-03-31 08:00:00
# 查看活跃会话
SQL> select
s.sid,
s.serial#,
s.username,
s.status,
s.program,
s.sql_id,
s.event,
s.seconds_in_wait
from v$session s
where s.status = ‘ACTIVE’ and s.username is not null;SID SERIAL# USERNAME STATUS PROGRAM SQL_ID EVENT SECONDS_IN_WAIT
———- ———- ———- ——– ——————————– ————- —————————— —————
123 45678 FGEDU ACTIVE sqlplus@fgedu.net.cn abc123xyz000 db file sequential read 5
# 查看会话等待事件
SQL> select
s.sid,
s.serial#,
s.username,
s.program,
w.event,
w.wait_time,
w.seconds_in_wait,
w.state
from v$session s, v$session_wait w
where s.sid = w.sid and s.username is not null;
3.2 Oracle数据库SQL相关视图
3.2.1 Oracle数据库SQL查询
SQL> select
sql_id,
sql_text,
elapsed_time/1000000 as elapsed_sec,
cpu_time/1000000 as cpu_sec,
executions,
buffer_gets,
disk_reads
from v$sql
order by elapsed_time desc
fetch first 10 rows only;SQL_ID SQL_TEXT ELAPSED_SEC CPU_SEC EXECUTIONS BUFFER_GETS DISK_READS
————- ——————————————— ———– ———- ———- ———– ———-
abc123xyz000 select * from fgedu_employees where … 300.5 250.5 100 500000 10000
# 查看SQL执行计划
SQL> select * from table(dbms_xplan.display_cursor(‘abc123xyz000’));PLAN_TABLE_OUTPUT
——————————————————————————–
SQL_ID abc123xyz000, child number 0
————————————-
select * from fgedu_employees where employee_id = :1
Plan hash value: 1234567890
——————————————————————————–
| Id | Operation | Name | Rows | Bytes | Cost |
——————————————————————————–
| 0 | SELECT STATEMENT | | | | 2 |
| 1 | TABLE ACCESS BY INDEX ROWID| FGEDU_EMPLOYEES | 1 | 100 | 2 |
|* 2 | INDEX UNIQUE SCAN | PK_EMP_ID | 1 | | 1 |
——————————————————————————–
Predicate Information (identified by operation id):
—————————————————
2 – access(“EMPLOYEE_ID”=:1)
3.3 Oracle数据库存储相关视图
3.3.1 Oracle数据库I/O查询
SQL> select
df.name,
fs.phyrds,
fs.phywrts,
fs.readtim,
fs.writetim
from v$datafile df, v$filestat fs
where df.file# = fs.file#
order by fs.phyrds desc;NAME PHYRDS PHYWRTS READTIM WRITETIM
————————————————– ———- ———- ———- ———-
/oradata/fgedudb/system01.dbf 100000 50000 500000 200000
/oradata/fgedudb/fgedu_data01.dbf 80000 60000 400000 300000
# 查看表空间I/O
SQL> select
ts.name,
sum(fs.phyrds) as phyrds,
sum(fs.phywrts) as phywrts,
sum(fs.readtim) as readtim,
sum(fs.writetim) as writetim
from v$tablespace ts, v$datafile df, v$filestat fs
where ts.ts# = df.ts# and df.file# = fs.file#
group by ts.name
order by sum(fs.phyrds) desc;NAME PHYRDS PHYWRTS READTIM WRITETIM
————————————————– ———- ———- ———- ———-
SYSTEM 100000 50000 500000 200000
FGEDU_DATA 80000 60000 400000 300000
# 查看系统等待事件
SQL> select
event,
total_waits,
time_waited,
average_wait,
time_waited_micro
from v$system_event
order by time_waited desc
fetch first 10 rows only;
Part04-生产案例与实战讲解
4.1 Oracle数据库性能问题诊断
使用动态性能视图进行性能问题诊断:
4.1.1 Oracle数据库性能问题诊断流程
# 查看系统等待事件
SQL> select event, total_waits, time_waited, average_wait
from v$system_event order by time_waited desc;# 查看Top等待事件
EVENT TOTAL_WAITS TIME_WAITED AVERAGE_WAIT
———————————– ———– ———– ————
db file sequential read 100000 50000000 50
log file sync 50000 30000000 600
# 步骤2:查看当前会话
SQL> select sid, serial#, username, status, program, event, seconds_in_wait
from v$session where status = ‘ACTIVE’ and username is not null;# 步骤3:查看Top SQL
SQL> select sql_id, sql_text, elapsed_time/1000000, executions
from v$sql order by elapsed_time desc;# 步骤4:查看锁和阻塞
SQL> select * from v$lock where request > 0;SQL> select blocking_session, sid, username from v$session where blocking_session is not null;# 步骤5:查看I/O情况
SQL> select name, phyrds, phywrts from v$filestat fs, v$datafile df
where fs.file# = df.file# order by phyrds desc;
4.2 Oracle数据库瓶颈分析
SQL> select name, value from v$sysstat where name like ‘%CPU%’;NAME VALUE
—————————————————————- ———-
CPU used by this session 5000000
CPU used when call started 4800000
parse time cpu 200000
# 内存瓶颈分析
SQL> select name, value from v$pgastat;NAME VALUE
—————————————————————- ———-
aggregate PGA target parameter 1073741824
aggregate PGA auto target 805306368
global memory bound 107374182
# I/O瓶颈分析
SQL> select event, total_waits, time_waited from v$system_event
where event like ‘db file%’ order by time_waited desc;EVENT TOTAL_WAITS TIME_WAITED
———————————– ———– ———–
db file sequential read 100000 50000000
db file scattered read 20000 10000000
db file parallel write 10000 5000000
# 锁瓶颈分析
SQL> select type, lmode, request, count(*) from v$lock
group by type, lmode, request;TY LMODE REQUEST COUNT(*)
— ———- ———- ———-
TM 3 0 5
TX 6 0 3
TX 0 6 1
4.3 Oracle数据库性能优化案例
动态性能视图在性能优化中的应用:
- SQL优化:使用V$SQL和V$SQL_PLAN分析慢SQL
- I/O优化:使用V$FILESTAT和V$SYSTEM_EVENT分析I/O
- 锁优化:使用V$LOCK和V$SESSION分析锁等待
- 内存优化:使用V$SGA和V$PGA分析内存使用
- 参数优化:使用V$PARAMETER和V$SYSSTAT分析参数
Part05-风哥经验总结与分享
5.1 Oracle数据库动态性能视图使用最佳实践
Oracle数据库动态性能视图使用最佳实践:
- 熟悉常用视图:V$SESSION、V$SQL、V$LOCK、V$SYSTEM_EVENT等
- 结合AWR使用:实时监控用V$视图,历史分析用AWR
- 使用适当工具:SQL*Plus、PL/SQL Developer、Toad等
- 建立监控脚本:整理常用的监控查询脚本
- 设置告警:对关键指标设置监控告警
- 定期分析:定期分析性能趋势
5.2 Oracle数据库常用视图检查清单
– [ ] V$SESSION
– [ ] V$SESSION_WAIT
– [ ] V$SESSION_EVENT
– [ ] V$SESS_IO
# SQL相关视图
– [ ] V$SQL
– [ ] V$SQLAREA
– [ ] V$SQLTEXT
– [ ] V$SQL_PLAN
# 锁相关视图
– [ ] V$LOCK
– [ ] V$LOCKED_OBJECT
– [ ] V$LATCH
– [ ] V$ENQUEUE_LOCK
# 存储相关视图
– [ ] V$DATAFILE
– [ ] V$FILESTAT
– [ ] V$TABLESPACE
– [ ] V$LOG
– [ ] V$ARCHIVED_LOG
# 系统统计视图
– [ ] V$SYSSTAT
– [ ] V$SESSTAT
– [ ] V$SYSTEM_EVENT
– [ ] V$WAITSTAT
# 内存相关视图
– [ ] V$SGA
– [ ] V$SGASTAT
– [ ] V$PGA
– [ ] V$PGASTAT
5.3 Oracle数据库性能监控工具推荐
Oracle数据库性能监控工具推荐:
- AWR(Automatic Workload Repository):自动负载信息库
- ASH(Active Session History):活动会话历史
- ADD M(Automatic Database Diagnostic Monitor):自动诊断监控器
- SQL Trace:SQL跟踪
- tkprof:格式化SQL Trace输出
- Oracle Enterprise Manager:图形化监控工具
- 第三方工具:Toad、PL/SQL Developer、Spotlight等
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
