工作中遇到不少開發跑過來,急匆匆的說我的存儲過程執行好慢幫忙看看是哪里慢的情況。
拋開鎖阻塞,存儲過程執行緩慢大概率是其中的sql 語句執行緩慢,那么怎么樣快速定位到是哪個sql 執行有問題呢,或者是找到了有問題的sql 需要調整,怎么告知開發有問題的sql 是屬於哪一個存儲過程,相信日常工作中dba 都會遇到這樣的問題。主要有以下方式:
1、通過v$active_session_history 結合 v$sql 視圖定位存儲過程與sql 語句之間的關系
首先定位存儲過程的sql_id,可以通過存儲過程名稱模糊查詢,一般類似 BEGIN 存儲過程名稱 EDN,通過like 匹配查詢v$sql 視圖
select sql_id,sql_text from v$sql t where t.SQL_TEXT like ‘%存儲過程名稱%’
找到存儲過程sql_id 后,通過v$active_session_history 視圖查找存儲過程包含的sql 語句的sql_id
select distinct t.SQL_ID,t.TOP_LEVEL_SQL_ID from v$active_session_history t where t.TOP_LEVEL_SQL_ID='&存儲過程sql_id'
拿到sql 語句的sql_id 后 結合v$sql_monitor 、v$sql_plan_monitor、DBA_HIST_SQLSTATS、DBA_HIST_SNAPSHOT就能分析到哪些sql 語句執行時間最長、執行計划有無問題、執行計划有無發生變化准對具體的sql 語句進行優化、調整。
2、通過OEM 快速定位sql 語句與存儲過程之間的聯系
打開OEM Top Activity Top SQL頁面,一般執行速度慢的sql 都能看到,點擊排在前面的sql_id 超鏈接
打開 sql details 頁面,點擊統計信息,就能看到sql 屬於哪個存儲過程在調用、sql 執行速度、資源消耗情況: