1. 程式人生 > >Oracle how to :查詢最消耗資源的sql及session

Oracle how to :查詢最消耗資源的sql及session

   方法1

        在業務最忙的時間段生成一個15分鐘的statspack報告或者awr,檢視 裡面的top sql

   方法2 

      使用top工具,檢視當前最消耗資源的OS程序,並記住相應的程序ID(PID),該PID對應到Oracle

      的v$process中的addr,$session中的paddr 

          執行如下查詢來找到問題sql   (假設對應的pid為4529)

       SELECT p.pid,p.spid,p.username,s.sid,s.serial#,c.hash_value,c.sql_text

       FROM v$process p,v$session s,v$sqltext c

       WHERE a.addr=s.paddr

       AND s.sql_hash_value=c.hash_value

       and  p.spid=4529

     解決方法

       找到問題會話後,通常使用一下命令kill 程序

alter system kill session 'sid,serial#';     ---這裡的sid和serial#是通過上面的查詢語句獲得

但是此命令釋放資源極為緩慢,為了更快速的釋放資源,我們通常按照如下步驟kill程序

1.在作業系統級kill 程序

         kill -9 4529

2.在資料庫內部kill session 並指定immediate

引數

                     alter system kill session 'sid,serial#' immediate

       示例

       假如在資料庫層面kill session長時間無效果

      SQL> select sid,serial#,status from v$session;

       SID    SERIAL# STATUS

---------- ---------- --------

.....

       142       1124 KILLED

.......

首先找到該session對應的OS的程序ID 

SQL> select 'kill -9 ' || spid from v$process where addr=(select paddr from v$session where sid=&sid);

Enter value for sid: 142

old   1: select 'kill -9 ' || spid from v$process where addr=(select paddr from v$session where sid=&sid)

new   1: select 'kill -9 ' || spid from v$process where addr=(select paddr from v$session where sid=142)

KILL-9'||SPID

--------------------

kill -9 4529

在作業系統級別kill 掉該程序

    kill -9 4529

    ps -ef | grep 4529

然後在Oracle層面kill session,並加上immediate引數

SQL> alter system kill session '142,1124' immediate;

SQL> select sid,serial# ,status from v$session;

補充
1. 通過OS 程序ID 找到對應的資料庫session sid

SQL> select sid,serial# from v$session where paddr=(select addr from v$process where spid=&spid);

2  檢視當前session對應的sid,serial#

SQL> select sid,serial# from v$session where sid=(select sid from v$mystat where rownum=1);

3.通過session的sid找到對應的OS 的程序ID 

SQL> select spid from v$process where addr=(select paddr from v$session where sid=&sid);