在ORACLE數據庫應用調優中,一個SQL的執行次數/頻率也是常常需要關注的,因為某個SQL執行太頻繁,要么是由於應用設計有缺陷,需要在業務邏輯上做出優化處理,要么是業務特殊性所導致。如果執行頻繁的SQL,往往容易遭遇一些並發性的問題。 那么如何查看ORACLE數據庫某個SQL的執行頻率/次數呢? 下面來看看完整的示例代碼。
一、查詢執行最慢的sql
1 select * 2 from (select sa.SQL_TEXT, 3 sa.SQL_FULLTEXT, 4 sa.EXECUTIONS "執行次數", 5 round(sa.ELAPSED_TIME / 1000000, 2) "總執行時間", 6 round(sa.ELAPSED_TIME / 1000000 / sa.EXECUTIONS, 2) "平均執行時間", 7 sa.COMMAND_TYPE, 8 sa.PARSING_USER_ID "用戶ID", 9 u.username "用戶名", 10 sa.HASH_VALUE 11 from v$sqlarea sa 12 left join all_users u 13 on sa.PARSING_USER_ID = u.user_id 14 where sa.EXECUTIONS > 0 15 order by (sa.ELAPSED_TIME / sa.EXECUTIONS) desc) 16 where rownum <= 50;
二、查詢次數最多的 sql
1 select * 2 from (select s.SQL_TEXT, 3 s.EXECUTIONS "執行次數", 4 s.PARSING_USER_ID "用戶名", 5 rank() over(order by EXECUTIONS desc) EXEC_RANK 6 from v$sql s 7 left join all_users u 8 on u.USER_ID = s.PARSING_USER_ID) t 9 where exec_rank <= 100;
三、Oracle查詢SQL語句執行的耗時
1 select a.sql_text SQL語句, 2 b.etime 執行耗時, 3 c.user_id 用戶ID, 4 c.SAMPLE_TIME 執行時間, 5 c.INSTANCE_NUMBER 實例數, 6 u.username 用戶名, a.sql_id SQL編號 7 from dba_hist_sqltext a, 8 (select sql_id, ELAPSED_TIME_DELTA / 1000000 as etime 9 from dba_hist_sqlstat 10 where ELAPSED_TIME_DELTA / 1000000 >= 1) b, 11 dba_hist_active_sess_history c, 12 dba_users u 13 where a.sql_id = b.sql_id 14 and u.username = 'POADB' 15 and c.user_id = u.user_id 16 and b.sql_id = c.sql_id 17 and a.sql_text like '%insert into TTTTTT %' 18 order by SAMPLE_TIME desc, 19 b.etime desc;
四:定位系統里面哪些SQL腳本存在TABLE ACCESS FULL行為
1 select * from v$sql_plan v 2 where v.operation = 'TABLE ACCESS' 3 and v.OPTIONS = 'FULL' 4 and v.OBJECT_OWNER='POSDB';
1 select s.SQL_TEXT from v$sqlarea s 2 where s.SQL_ID = '4dpd97jh2gzsd' 3 and s.HASH_VALUE = '1613233933' 4 and s.PLAN_HASH_VALUE = '3592287464'; 5 6 /*或者*/ 7 select s.SQL_TEXT from v$sqlarea s where s.ADDRESS ='00000000A65D2318';