Oracle:実行されているSQLをリアルタイムで監視し、問題のあるSQLの実行計画を確認する | けしくんのWebLog

けしくんのWebLog

自分が考えたこと、調べたことを忘れずに残しておくため、Web上にLogを残していきます。

Oracle10g以降の環境で、現在DBで実行されているSQLをリアルタイム監視するSQLスクリプト

よく使うOracle SQL/コマンドまとめ
 

set pages 1000
set long  20000
set lines 200
col buffer_gets for 99999999999
col sql_text for a80
col event for a30
col username for a10
col module for a15
select substrb(b.sql_text,1,80) as sql_text, a.last_call_et, a.username, substrb(a.module,1,15) as module, a.event, a.seconds_in_wait, a.sql_id, c.buffer_gets
from v$session a,v$sql b, v$sqlarea c
where a.sql_id = b.sql_id
and a.sql_child_number = b.child_number
and a.sql_hash_value=c.hash_value
and a.sql_address=c.address
and a.username is not null
and a.status = 'ACTIVE'
and a.event not like 'SQL*Net message%'
and a.event not like 'Streams AQ:%'
and a.event not like 'pipe get'
order by a.username;


※このSQLを自動的に実行したい場合、これをSQLファイルとして保存し、SQL自動実行シェルスクリプトに組み込んで実行させる。
※上記SQLの改造で役に立つと思われる列は以下の通り
・v$sessionの列
 sid列とserial#列・・・不要なセッションをKILLする場合に必要
 machine列・・・SQLの発行を行ったマシン名(サーバーやPCのコンピュータ名が表示される)

※パフォーマンスに問題があるSQLが発見されたら、SQL_IDから実行されているSQLの全文を確認する。

 

set long 40000
set pages 1000
set lines 120
select sql_fulltext from v$sql where sql_id = '&sql_id';


※SQL_IDから、そのSQLの実行計画を表示させるスクリプトは以下の通り。
 このSQLは少々重いため、高負荷DB環境では頻繁に実行しないようにすること。

※パッケージを使用して取得する方法に変更。これであればすぐに実行計画を取得できる。(2017/10/10)

 

set linesize 300
set pagesize 50000
set trimspool on
select * from table(dbms_xplan.display_cursor('&SQL_ID',0,'ALL ALLSTATS LAST'));

 

 

よく使うOracle SQL/コマンドまとめ