oracle查看執行最慢與查詢次數最多的sql語句及其執行速度很慢的問題分析


在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';

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM