一、需求,如何根據存儲過程定位慢SQL?
需求說明,數據庫執行的SQL出現性能問題,如何是單條SQL比較好找到問題SQL,但是如過是存儲過程呢?
存儲過程中可能會衍生出不同的動態SQL,那么具體調用存儲過程中,存儲過程執行慢在什么SQL的位置呢?
二、方法
2.1 Trace 10046
SQL>execute sys.dbms_system.set_ev(7,36,10046,12,''); exec sql SQL>execute sys.dbms_system.set_ev(7,36,10046,0,''); tkprof ora_2229_10046.trc 888.trc
可以通過disk 排序之類的方式,定位TOP SQL
特點:
1.需要再次執行一次存儲過程;
2.定位top sql並不高效,需要對disk 操作系統文件進行一定的grep 過濾 order by 人為查詢
2.2 dbms包分析
執行dbms包進行分析,sys.DBMS_PROFILER.start_profiler
這里有兩種途徑,1.使用plsql圖形化進行調試,2.手工通過sql調用執行 https://blog.csdn.net/Hehuyi_In/article/details/107771428 使用plsql對存儲過程進行調試 1、在“Procedures”下拉列表中找到已經編寫好的存儲過程,點擊右鍵,找到“測試”,如圖所示: 2、PL\SQL會打開調試界面,圖中位置1的按鈕就是開始調試的按鈕,在調試之前要填寫輸入參數的值,位置2就是填寫參數的地方,如果有多個參數,會有多行參數框,按參數名填寫相應的參數即可,
如果沒有參數,可以不填。 3、填寫完參數,單擊開始調試按鈕后,調試的界面會發生一些變化。圖中位置1的變化,說明存過已經處於執行狀態,別人不能再編譯或者執行。位置2的按鈕就是執行按鈕,
單擊這個按鈕存過會執行完成或者遇到bug跳出,否則是不會停下來的,調試時不會用這個按鈕的。位置3的按鈕才是關鍵——單步執行,就是讓代碼一行一行的執行,位置4的按鈕是跳出單步執行,
等待下一個指令。 特點: 1.需要再次執行一次存儲過程; 2.定位存儲過程的慢SQL比較方便,因為有一個整體的性能消耗的展示
2.3 Ash視圖查詢
原理就是V$ACTIVE_SESSION_HISTORY ash有top_level_sql_id(就是存儲過程的sql_id),根據執行時間定位哪個sql_id執行時間長,每個sql都有sql_exec_start
1.跟客戶溝通得到執行存儲過程慢的時間范圍;
2.通過時間,根據sql_id or top_level_sql_id進行group by count 得到top sql
3.根據步驟2得到的sql_id,查詢sql_text,與客戶反饋確認執行存儲過程的慢sql,對應sql_id
4.根據sql_id or top_level_sql_id 等於執行存儲過程的慢sql,找到存儲過程里面執行的內部sql_id
5.將內部sql_id 進行循環或者每個進行檢查sql執行時間,得到top sql
特點:
1.無需客戶再次執行;
2.得到匯總的結果比例比較麻煩,需要寫腳本完成循環過程,否則分析時間很長。