如何識別 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;