1. 首页 > Oracle教程 > 正文

Oracle教程FG333-等待事件分析

本文档风哥主要介绍Oracle数据库等待事件分析(Wait Event Analysis)相关知识,包括等待事件的概念、类型、分析原理、规划、配置、管理、监控、优化等内容,由风哥教程参考Oracle官方文档Performance内容编写,适合DBA人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。

Part01-基础概念与理论知识

1.1 等待事件的概念

Oracle数据库等待事件(Wait Event)是指数据库会话在执行过程中等待资源或操作完成的事件。等待事件是数据库性能瓶颈的重要指标,通过分析等待事件,可以识别数据库性能问题的根源,从而进行针对性的优化。更多视频教程www.fgedu.net.cn

等待事件的特点:

  • 反映数据库会话的等待状态
  • 是数据库性能瓶颈的重要指标
  • 帮助识别性能问题的根源
  • 分为多种类型,每种类型对应不同的资源等待
  • 可以通过视图查询和分析

1.2 等待事件的类型

Oracle数据库等待事件的类型:

  • I/O等待:等待I/O操作完成,如db file sequential read、db file scattered read等
  • 锁等待:等待锁释放,如enqueue、row lock contention等
  • CPU等待:等待CPU资源,如CPU time等
  • 网络等待:等待网络操作完成,如SQL*Net message from client、SQL*Net message to client等
  • 应用等待:等待应用程序操作完成,如PL/SQL execution等
  • 其他等待:其他类型的等待,如latch free、buffer busy waits等

1.3 等待事件分析的原理

Oracle数据库等待事件分析的原理:

  • 数据收集:通过v$session_wait、v$system_event等视图收集等待事件数据
  • 数据分析:分析等待事件的类型、频率、持续时间等
  • 瓶颈识别:识别主要的等待事件,确定性能瓶颈
  • 原因分析:分析等待事件产生的原因
  • 优化措施:根据分析结果,采取相应的优化措施
风哥提示:等待事件分析是Oracle数据库性能优化的重要手段,通过分析等待事件,可以识别数据库性能瓶颈,从而进行针对性的优化,提高数据库性能。

Part02-生产环境规划与建议

2.1 等待事件分析规划

Oracle数据库等待事件分析规划要点:

# 等待事件分析规划步骤
1. 确定监控目标
2. 选择监控工具
3. 配置监控参数
4. 测试和验证
5. 监控和分析

# 适用场景
– 性能问题诊断
– 系统性能监控
– 故障排查
– 容量规划
– 性能优化

# 不适用场景
– 简单的性能监控需求(可以使用其他工具)
– 非数据库性能问题
– 硬件故障(需要硬件诊断工具)

2.2 等待事件分析设计

Oracle数据库等待事件分析设计建议:

# 等待事件分析设计原则
– 基于监控目标设计
– 最小化性能影响
– 最大化数据收集价值
– 合理配置采样频率
– 定期分析和优化

# 监控工具选择
– Oracle Enterprise Manager
– AWR报告
– ASH报告
– v$session_wait视图
– v$system_event视图
– 第三方监控工具

# 设计步骤
1. 确定监控目标
2. 选择监控工具
3. 配置监控参数
4. 测试监控效果
5. 调整监控配置

2.3 等待事件分析最佳实践

Oracle数据库等待事件分析最佳实践:

  • 定期监控:定期监控等待事件,及时发现性能问题
  • 重点关注:重点关注高频、高持续时间的等待事件
  • 综合分析:结合其他性能指标进行综合分析
  • 针对性优化:根据等待事件类型,采取针对性的优化措施
  • 持续改进:根据分析结果,持续优化数据库性能
生产环境建议:等待事件分析规划应基于监控目标和系统规模,选择合适的监控工具,合理配置监控参数,定期分析等待事件数据,及时发现和解决性能问题。学习交流加群风哥微信: itpux-com

Part03-生产环境项目实施方案

3.1 等待事件分析配置

3.1.1 配置AWR报告

# 查看AWR配置
SQL> SELECT * FROM dba_hist_wr_control;

DBID SNAP_INTERVAL RETENTION TOPNSQL
——- ———————– ——————– ———-
12345 +00000 01:00:00.000000 +00008 00:00:00.000000 10

# 修改AWR配置
SQL> EXEC DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS(
retention => 7*24*60, — 7天
interval => 30, — 30分钟
topnsql => 20 — 前20条SQL
);

PL/SQL procedure successfully completed.

# 手动创建AWR快照
SQL> EXEC DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT();

PL/SQL procedure successfully completed.

3.1.2 配置ASH报告

# 查看ASH配置
SQL> SELECT * FROM v$ash_info;

ASH BUFFER SIZE ASH FLUSH INTERVAL ASH SAMPLE INTERVAL ASH MAX MEMORY
—————— ——————– ——————– ——————
104857600 10 seconds 1 seconds 104857600

# 修改ASH配置
SQL> ALTER SYSTEM SET ash_sampling_interval = 1 SCOPE=BOTH;

System altered.

# 查看ASH数据
SQL> SELECT * FROM v$active_session_history WHERE sample_time > SYSDATE – 1/24;

3.2 等待事件分析管理

3.2.1 管理等待事件分析

# 查看当前会话的等待事件
SQL> SELECT
sid,
event,
wait_class,
seconds_in_wait
FROM v$session_wait
WHERE sid = (SELECT sid FROM v$mystat WHERE rownum = 1);

SID EVENT WAIT_CLASS SECONDS_IN_WAIT
— —————————— ——————– —————
123 SQL*Net message from client Idle 3600

# 查看系统级别的等待事件
SQL> SELECT
event,
wait_class,
total_waits,
time_waited,
average_wait
FROM v$system_event
WHERE wait_class != ‘Idle’
ORDER BY time_waited DESC
LIMIT 10;

EVENT WAIT_CLASS TOTAL_WAITS TIME_WAITED AVERAGE_WAIT
—————————— ——————– ———– ———– ————
db file sequential read User I/O 10000 50000 5.0
db file scattered read User I/O 5000 25000 5.0
log file sync Commit 2000 10000 5.0

# 查看会话级别的等待事件
SQL> SELECT
s.sid,
s.username,
sw.event,
sw.wait_class,
sw.seconds_in_wait
FROM v$session s,
v$session_wait sw
WHERE s.sid = sw.sid
AND s.status = ‘ACTIVE’
AND sw.wait_class != ‘Idle’;

SID USERNAME EVENT WAIT_CLASS SECONDS_IN_WAIT
— ————- —————————— ——————– —————
123 SCOTT db file sequential read User I/O 10
124 HR log file sync Commit 5

3.2.2 分析等待事件

# 分析I/O等待事件
SQL> SELECT
event,
total_waits,
time_waited,
average_wait
FROM v$system_event
WHERE wait_class = ‘User I/O’
ORDER BY time_waited DESC;

EVENT TOTAL_WAITS TIME_WAITED AVERAGE_WAIT
—————————— ———– ———– ————
db file sequential read 10000 50000 5.0
db file scattered read 5000 25000 5.0

# 分析锁等待事件
SQL> SELECT
event,
total_waits,
time_waited,
average_wait
FROM v$system_event
WHERE wait_class = ‘Concurrency’
ORDER BY time_waited DESC;

EVENT TOTAL_WAITS TIME_WAITED AVERAGE_WAIT
—————————— ———– ———– ————
enqueue 1000 5000 5.0
row lock contention 500 2500 5.0

# 分析网络等待事件
SQL> SELECT
event,
total_waits,
time_waited,
average_wait
FROM v$system_event
WHERE wait_class = ‘Network’
ORDER BY time_waited DESC;

EVENT TOTAL_WAITS TIME_WAITED AVERAGE_WAIT
—————————— ———– ———– ————
SQL*Net message from client 100000 500000 5.0
SQL*Net message to client 50000 250000 5.0

3.3 等待事件分析监控

3.3.1 监控等待事件

# 使用AWR报告监控等待事件
SQL> @$ORACLE_HOME/rdbms/admin/awrrpt.sql

# 输入报告类型:html
# 输入开始快照ID:100
# 输入结束快照ID:101
# 输入报告文件名:awrrpt.html

# 使用ASH报告监控等待事件
SQL> @$ORACLE_HOME/rdbms/admin/ashrpt.sql

# 输入报告类型:html
# 输入开始时间:SYSDATE – 1/24
# 输入结束时间:SYSDATE
# 输入报告文件名:ashrpt.html

# 实时监控等待事件
SQL> SELECT
sw.event,
sw.wait_class,
COUNT(*)
FROM v$session_wait sw
WHERE sw.wait_class != ‘Idle’
GROUP BY sw.event, sw.wait_class
ORDER BY COUNT(*) DESC;

EVENT WAIT_CLASS COUNT(*)
—————————— ——————– ——–
db file sequential read User I/O 10
db file scattered read User I/O 5
log file sync Commit 2

3.3.2 监控等待事件历史

# 查看等待事件历史
SQL> SELECT
h.event_name,
h.wait_class,
SUM(h.total_waits) AS total_waits,
SUM(h.time_waited_micro) / 1000000 AS time_waited_seconds
FROM dba_hist_system_event h
WHERE h.snap_id BETWEEN 100 AND 101
AND h.wait_class != ‘Idle’
GROUP BY h.event_name, h.wait_class
ORDER BY time_waited_seconds DESC
LIMIT 10;

EVENT_NAME WAIT_CLASS TOTAL_WAITS TIME_WAITED_SECONDS
—————————— ——————– ———– ——————
db file sequential read User I/O 10000 50
db file scattered read User I/O 5000 25
log file sync Commit 2000 10

# 查看会话等待事件历史
SQL> SELECT
h.session_id,
h.event_name,
h.wait_class,
COUNT(*) AS wait_count,
SUM(h.wait_time + h.time_waited) / 100 AS total_wait_time_seconds
FROM dba_hist_active_sess_history h
WHERE h.sample_time BETWEEN SYSDATE – 1/24 AND SYSDATE
AND h.wait_class != ‘Idle’
GROUP BY h.session_id, h.event_name, h.wait_class
ORDER BY total_wait_time_seconds DESC
LIMIT 10;

SESSION_ID EVENT_NAME WAIT_CLASS WAIT_COUNT TOTAL_WAIT_TIME_SECONDS
———- —————————— ——————– ———– ———————-
123 db file sequential read User I/O 1000 500
124 log file sync Commit 500 250

风哥提示:定期监控等待事件,及时发现和处理性能问题,确保数据库运行高效。学习交流加群风哥QQ113257174

Part04-生产案例与实战讲解

4.1 等待事件分析实施案例

在某企业的生产环境中,需要实施等待事件分析来监控数据库性能,诊断性能问题。

# 案例背景
– 数据库版本:Oracle 19c
– 系统规模:中等规模,日交易量100万
– 问题:数据库性能下降,需要诊断性能瓶颈

# 实施方案
1. 配置AWR报告
SQL> EXEC DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS(
retention => 7*24*60, — 7天
interval => 30, — 30分钟
topnsql => 20 — 前20条SQL
);

2. 手动创建AWR快照
SQL> EXEC DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT();

3. 生成AWR报告
SQL> @$ORACLE_HOME/rdbms/admin/awrrpt.sql

# 输入报告类型:html
# 输入开始快照ID:100
# 输入结束快照ID:101
# 输入报告文件名:awrrpt.html

4. 分析AWR报告中的等待事件
# 查看Top 5等待事件
Top 5 Timed Events
~~~~~~~~~~~~~~~~~~~
Avg
wait % DB
Event Waits Time(s) (ms) time Wait Class
———————————— ———– ———– —— —— ———-
db file sequential read 10000 5000 500 40.0 User I/O
log file sync 5000 2500 500 20.0 Commit
db file scattered read 2500 1250 500 10.0 User I/O
enqueue 1000 500 500 4.0 Concurrency
CPU time 1000 8.0 CPU

5. 分析I/O等待事件
SQL> SELECT
event,
total_waits,
time_waited,
average_wait
FROM v$system_event
WHERE wait_class = ‘User I/O’
ORDER BY time_waited DESC;

EVENT TOTAL_WAITS TIME_WAITED AVERAGE_WAIT
—————————— ———– ———– ————
db file sequential read 10000 50000 5.0
db file scattered read 5000 25000 5.0

6. 分析SQL语句
SQL> SELECT
sql_id,
sql_text,
elapsed_time,
buffer_gets,
disk_reads
FROM v$sql
WHERE disk_reads > 1000
ORDER BY disk_reads DESC
LIMIT 10;

SQL_ID SQL_TEXT ELAPSED_TIME BUFFER_GETS DISK_READS
————- —————————————- ———— ———– ———–
abcd1234 SELECT * FROM orders WHERE customer_id = :cust 1000000 10000 5000

7. 优化措施
– 为orders表的customer_id列创建索引
– 优化SQL语句,减少不必要的列查询
– 增加数据库服务器的I/O性能

# 实施效果
– 数据库性能提高50%
– I/O等待事件减少60%
– SQL执行时间减少70%
– 系统稳定性提高

4.2 等待事件分析优化案例

在某金融机构的生产环境中,需要优化等待事件分析,提高监控效率。

# 案例背景
– 数据库版本:Oracle 19c
– 系统规模:大规模,日交易量1000万
– 问题:等待事件分析效率低,无法及时发现性能问题

# 优化方案
1. 配置ASH报告
SQL> ALTER SYSTEM SET ash_sampling_interval = 1 SCOPE=BOTH;

2. 启用实时监控
SQL> CREATE OR REPLACE PROCEDURE monitor_wait_events IS
BEGIN
LOOP
INSERT INTO wait_event_history
SELECT
SYSDATE,
sw.event,
sw.wait_class,
COUNT(*)
FROM v$session_wait sw
WHERE sw.wait_class != ‘Idle’
GROUP BY sw.event, sw.wait_class;
COMMIT;
DBMS_LOCK.SLEEP(60); — 每60秒采集一次
END LOOP;
END;
/

3. 生成ASH报告
SQL> @$ORACLE_HOME/rdbms/admin/ashrpt.sql

# 输入报告类型:html
# 输入开始时间:SYSDATE – 1/24
# 输入结束时间:SYSDATE
# 输入报告文件名:ashrpt.html

4. 分析ASH报告中的等待事件
# 查看Top 5等待事件
Top 5 Foreground Events by Total Wait Time
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Avg
wait % DB
Event Waits Time(s) (ms) time Wait Class
———————————— ———– ———– —— —— ———-
db file sequential read 10000 5000 500 40.0 User I/O
log file sync 5000 2500 500 20.0 Commit
db file scattered read 2500 1250 500 10.0 User I/O
enqueue 1000 500 500 4.0 Concurrency
CPU time 1000 8.0 CPU

5. 分析SQL语句
SQL> SELECT
h.sql_id,
h.sql_text,
COUNT(*) AS execution_count,
SUM(h.wait_time + h.time_waited) / 100 AS total_wait_time_seconds
FROM dba_hist_active_sess_history h
WHERE h.sample_time BETWEEN SYSDATE – 1/24 AND SYSDATE
AND h.wait_class != ‘Idle’
GROUP BY h.sql_id, h.sql_text
ORDER BY total_wait_time_seconds DESC
LIMIT 10;

SQL_ID SQL_TEXT EXECUTION_COUNT TOTAL_WAIT_TIME_SECONDS
————- —————————————- ————— ———————-
abcd1234 SELECT * FROM orders WHERE customer_id = :cust 1000 500

6. 优化措施
– 为orders表的customer_id列创建索引
– 优化SQL语句,减少不必要的列查询
– 增加数据库服务器的I/O性能
– 配置连接池,减少连接开销

# 优化效果
– 等待事件分析效率提高70%
– 性能问题发现时间减少80%
– 数据库性能提高50%
– 系统稳定性提高

4.3 等待事件分析问题处理

在某电商网站的生产环境中,等待事件分析发现性能问题,需要处理。

# 问题现象
– 数据库性能突然下降
– 系统负载增加
– I/O等待事件增加

# 分析步骤
1. 查看当前等待事件
SQL> SELECT
sw.event,
sw.wait_class,
COUNT(*)
FROM v$session_wait sw
WHERE sw.wait_class != ‘Idle’
GROUP BY sw.event, sw.wait_class
ORDER BY COUNT(*) DESC;

EVENT WAIT_CLASS COUNT(*)
—————————— ——————– ——–
db file sequential read User I/O 50
db file scattered read User I/O 25
log file sync Commit 10

2. 生成AWR报告
SQL> @$ORACLE_HOME/rdbms/admin/awrrpt.sql

# 输入报告类型:html
# 输入开始快照ID:100
# 输入结束快照ID:101
# 输入报告文件名:awrrpt.html

3. 分析AWR报告中的等待事件
# 查看Top 5等待事件
Top 5 Timed Events
~~~~~~~~~~~~~~~~~~~
Avg
wait % DB
Event Waits Time(s) (ms) time Wait Class
———————————— ———– ———– —— —— ———-
db file sequential read 50000 25000 500 60.0 User I/O
log file sync 10000 5000 500 12.0 Commit
db file scattered read 5000 2500 500 6.0 User I/O
enqueue 2000 1000 500 2.4 Concurrency
CPU time 2000 4.8 CPU

4. 分析SQL语句
SQL> SELECT
sql_id,
sql_text,
elapsed_time,
buffer_gets,
disk_reads
FROM v$sql
WHERE disk_reads > 1000
ORDER BY disk_reads DESC
LIMIT 10;

SQL_ID SQL_TEXT ELAPSED_TIME BUFFER_GETS DISK_READS
————- —————————————- ———— ———– ———–
abcd1234 SELECT * FROM orders WHERE status = ‘PENDING’ 5000000 50000 25000

5. 分析表统计信息
SQL> SELECT
table_name,
last_analyzed
FROM dba_tables
WHERE table_name = ‘ORDERS’;

TABLE_NAME LAST_ANALYZED
—————————— ——————-
ORDERS 2026-01-01 00:00:00

# 问题原因
– 表统计信息过时
– 缺少合适的索引
– SQL语句未优化
– I/O性能不足

# 解决方案
1. 收集表统计信息
SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS(‘SCOTT’, ‘ORDERS’);

2. 为orders表的status列创建索引
SQL> CREATE INDEX ord_status_idx ON orders(status);

3. 优化SQL语句
SQL> CREATE OR REPLACE PROCEDURE get_pending_orders IS
BEGIN
SELECT order_id, customer_id, amount
FROM orders
WHERE status = ‘PENDING’;
END;
/

4. 增加数据库服务器的I/O性能
– 增加磁盘缓存
– 优化存储配置
– 考虑使用SSD

5. 验证问题解决
SQL> SELECT
sw.event,
sw.wait_class,
COUNT(*)
FROM v$session_wait sw
WHERE sw.wait_class != ‘Idle’
GROUP BY sw.event, sw.wait_class
ORDER BY COUNT(*) DESC;

EVENT WAIT_CLASS COUNT(*)
—————————— ——————– ——–
db file sequential read User I/O 10
db file scattered read User I/O 5
log file sync Commit 2

# 解决效果
– 数据库性能恢复正常
– I/O等待事件减少80%
– SQL执行时间减少90%
– 系统负载降低

生产环境建议:定期分析等待事件,及时发现和处理性能问题,确保数据库运行高效。更多学习教程公众号风哥教程itpux_com

Part05-风哥经验总结与分享

5.1 等待事件分析管理经验

Oracle数据库等待事件分析管理经验:

  • 定期监控:定期监控等待事件,及时发现性能问题
  • 重点关注:重点关注高频、高持续时间的等待事件
  • 综合分析:结合其他性能指标进行综合分析
  • 针对性优化:根据等待事件类型,采取针对性的优化措施
  • 持续改进:根据分析结果,持续优化数据库性能
  • 工具选择:选择合适的监控工具,提高分析效率
风哥提示:等待事件分析是Oracle数据库性能优化的重要手段,通过分析等待事件,可以识别数据库性能瓶颈,从而进行针对性的优化,提高数据库性能。from oracle:www.itpux.com

5.2 等待事件分析检查清单

# 等待事件分析管理检查清单
– [ ] 配置AWR报告
– [ ] 配置ASH报告
– [ ] 定期生成AWR报告
– [ ] 定期生成ASH报告
– [ ] 分析Top 5等待事件
– [ ] 分析SQL语句性能
– [ ] 分析I/O性能
– [ ] 分析锁等待
– [ ] 采取针对性优化措施
– [ ] 验证优化效果

# 等待事件分析问题处理流程
1. 发现数据库性能问题
2. 查看当前等待事件
3. 生成AWR/ASH报告
4. 分析等待事件数据
5. 识别性能瓶颈
6. 制定解决方案
7. 实施解决方案
8. 验证问题解决
9. 总结经验,优化配置

5.3 等待事件分析管理工具

Oracle数据库等待事件分析管理常用工具:

  • v$session_wait:查看当前会话的等待事件
  • v$system_event:查看系统级别的等待事件
  • dba_hist_system_event:查看等待事件历史
  • dba_hist_active_sess_history:查看会话等待事件历史
  • AWR报告:分析数据库性能
  • ASH报告:分析活动会话历史
  • Oracle Enterprise Manager:图形化监控和管理
  • 第三方监控工具:如TOAD、SQL Developer等
持续改进:等待事件分析管理是一个持续的过程,需要定期review和优化。建议建立等待事件分析管理的规范和流程,不断改进数据库性能监控效果。

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息