如何识别 Oracle 数据库中的最近 WAIT 事件?
问题:
您想要找出数据库中最近发生的重要等待事件,以及导致大多数等待事件的用户、SQL 语句和对象。
解决方案
Oracle 为我们提供了 V$ACTIVE_SESSION_HISTORY 来获取有关最常见等待事件的信息,以及导致这些等待事件的 SQL 语句、数据库对象和用户。
查找等待事件的 SQL
示例
SELECT event, SUM(wait_time + time_waited) total_wait_time FROM v$active_session_history GROUP BY event ORDER BY total_wait_time DESC;
要找出等待时间最长的用户,我们可以使用以下 SQL。
示例
SELECT s.sid, s.username, SUM(a.wait_time + a.time_waited) total_wait_time FROM v$active_session_history a, v$session s WHERE a.session_id=s.sid GROUP BY s.sid, s.username ORDER BY total_wait_time DESC;
要找出等待时间最长的对象,我们可以使用以下 SQL。
示例
SELECT a.current_obj#, d.object_name, d.object_type, a.event, SUM(a.wait_time + a.time_waited) total_wait_time FROM v$active_session_history a, dba_objects d WHERE a.current_obj# = d.object_id GROUP BY a.current_obj#, d.object_name, d.object_type, a.event ORDER BY total_wait_time;
最后,我们可以通过以下查询来识别等待时间最长的 SQL 语句。
示例
SELECT a.user_id, u.username, s.sql_text, SUM(a.wait_time + a.time_waited) total_wait_time FROM v$active_session_history a, v$sqlarea s, dba_users u WHERE a.sql_id = s.sql_id AND a.user_id = u.user_id GROUP BY a.user_id, s.sql_text, u.username;