1. 程式人生 > 其它 >Oracle儲存過程如何定位慢SQL?

Oracle儲存過程如何定位慢SQL?

一、需求,如何根據儲存過程定位慢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.2dbms包分析

執行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.得到彙總的結果比例比較麻煩,需要寫指令碼完成迴圈過程,否則分析時間很長。