我正在对存在一些一般性能问题的 oracle 数据库进行故障排除。我运行了以下查询:
SELECT event AS "Event|Name",
total_waits "Total|Waits",
round(time_waited / 100, 0) "Seconds|Waiting",
total_timeouts "Total|Timeouts",
average_wait / 100 "Average|Wait|(in secs)"
FROM sys.v_$system_event e
ORDER BY time_waited DESC;
前几行返回如下。数百万秒的等待时间!(相比之下,我们的其他数据库对于顶级事件的等待时间小于 10 秒。)这些事件有什么作用,什么可能导致这些巨大的等待时间?数据库已经运行了 30 天,所以我们看到了这么长时间的聚合。
Event Name Waits Seconds Timeouts Avg Wait
---------------------- --------- -------- -------- --------
SQL*Net message from client 488397968 32050594 0 0.0656
rdbms ipc message 91335556 2455744 9529486 0.0269
DIAG idle wait 5214769 347077 5214769 0.0666
Streams AQ: qmn coordinator idle wait 186521 173696 93278 0.9312
Streams AQ: qmn slave idle wait 95359 173692 51 1.8215
Space Manager: slave idle wait 523165 173647 521016 0.3319
pmon timer 968303 173630 870108 0.1793
fbar timer 8770 173403 8713 19.7723
smon timer 14103 173278 7006 12.2866
log file sync 57967889 90402 649458 0.0016
og file parallel write 86618366 39509 0 0.0005
db file sequential read 244286101 11171 0 0
control file parallel write 1274395 3949 0 0.0031
db file scattered read 157316868 1635 0 0
db file parallel read 11948170 1190 0 0.0001
“来自客户端的 SQL Net 消息”是数据库等待客户端要求做某事所花费的时间(我也将其解释为数据库处理的 SQL Net 请求数量的指标)。AskTom有关于该事件的更多信息。它看起来也不是很长的平均等待时间,所以也许你有一个应用程序向服务器发出大量小请求?这是 30 天内的大量等待(平均每天 1600 万次)。
至于 rdbms ipc 消息,这意味着(Oracle 10g 参考):
“后台进程(LGWR、DBWR、LMS0)使用此事件来指示它们处于空闲状态,并正在等待前台进程向它们发送 IPC 消息以完成某些工作。”
从调优的角度来看,这通常是一个非事件。(伯勒森)
仅从 v$system_event 中选择的用处有限。该视图包含自上次启动数据库以来所有等待事件的总等待时间和计数。上次启动数据库的时间可能是一年前或几分钟前,但无论哪种方式,我通常只对我的 sql 语句、批处理作业或最终用户现在发生的事情感兴趣。最终用户等待非空闲非后台等待,但 v$system_event 包含所有事件,包括 50 多个空闲事件和许多等待处理数据库的后台、非用户进程。与其运行此查询,不如尝试运行 AWR 报告或 statspack 报告,或者查看企业管理器中的性能或顶部活动屏幕。快速查看数据库上正在发生的事情的方法是运行以下 select 语句:
这将告诉您谁在等待,谁在使用或请求 CPU。通过反复运行查询,您可以了解系统上存在哪些瓶颈。Oracle 的 10g 和更高版本的视图 v$active_session_history 包含每秒采样一次的此信息。它的数据比 v$system_event 强大得多,但数据很难挖掘。要挖掘数据,您可以使用 Enterprise Manager 的顶部活动屏幕,但如果您没有 OEM,则有一个很酷的免费工具
http://timurakhmadeev.wordpress.com/2010/02/18/ash-viewer/