Here is the one I've used for many years.
Next time I will show you how to troubleshooting Oracle database performance by this tool.
==
{code start}
#!/bin/bash
if [ $# -ne 1 ]
then
echo "Usage: psql.sh <ProcessID>"
exit
fi
sqlplus -S / as sysdba <<+++
set wrap on
set feedback off
set pagesize 0
set termout off
set echo off
set verify off
set arraysize 200
set linesize 200
set trimspool on
set trimout on
set long 5000
set serveroutput on size 200000
/*
-- Get execution plan
SELECT t.*
FROM v$sql s, table(DBMS_XPLAN.DISPLAY_CURSOR(s.sql_id, s.child_number, format=>'Advanced')) t
where s.sql_id = 'dcfkuagnmqx3y';
SELECT t.*
FROM v$sql s, table(DBMS_XPLAN.DISPLAY_CURSOR(s.sql_id, s.child_number, 'BASIC')) t
where s.sql_id = 'dcfkuagnmqx3y'
and s.last_load_time is not null
and loaded_versions > 0;
provides a way to display the SQL execution plan and SQL execution runtime statistics for cached SQL
cursors based on the information stored in the V$SQL_PLAN and V$SQL_PLAN_STATISTICS_ALL fixed views
*/
Begin
for s in
(select b.sid,b.serial#,b.username, b.machine,b.osuser,
b.program sprogram,c.program pprogram,c.terminal pterminal,b.terminal sterminal,PGA_ALLOC_MEM,
b.process,b.status,b.server,b.type,b.taddr,b.logon_time,b.LAST_CALL_ET,
b.lockwait, c.latchwait,c.latchspin,c.spid,
b.PREV_SQL_ID, b.sql_id,
EVENT, WAIT_TIME, SECONDS_IN_WAIT
from v\$session b, v\$process c
where c.spid = $1
and c.addr = b.paddr)
loop
--dbms_output.put_line('======================================================');
dbms_output.put_line('SID/Serial : '|| s.sid||','||s.serial#);
dbms_output.put_line('SQL_ID : '|| s.sql_id);
dbms_output.put_line('Foreground : '|| 'PID: '||s.process||' - '||s.sprogram);
dbms_output.put_line('Shadow : '|| 'PID: '||s.spid||' - '||s.pprogram);
dbms_output.put_line('Terminal : '|| s.sterminal || '/ ' || s.pterminal);
dbms_output.put_line('OS User : '|| s.osuser||' on '||s.machine);
dbms_output.put_line('Ora User : '|| s.username);
dbms_output.put_line('Status Flags: '|| s.status||' '||s.server||' '||s.type);
dbms_output.put_line('Tran Active : '|| nvl(s.taddr, 'NONE'));
dbms_output.put_line('Login Time : '|| to_char(s.logon_time, 'Day HH24:MI:SS'));
dbms_output.put_line('Last Call : '|| to_char(sysdate-(s.last_call_et/60/60/24), 'Day HH24:MI:SS') || ' - ' || to_char(s.last_call_et/60, '990.0') || ' min');
dbms_output.put_line('Lock/ Latch : '|| nvl(s.lockwait, 'NONE')||'/ '||nvl(s.latchwait, 'NONE'));
dbms_output.put_line('Latch Spin : '|| nvl(s.latchspin, 'NONE'));
dbms_output.put_line('PGA : '|| s.PGA_ALLOC_MEM);
dbms_output.put_line('Wait : '|| s.EVENT||': '||s.WAIT_TIME||', Seconds: '||s.SECONDS_IN_WAIT);
dbms_output.put_line('Current SQL statement:');
for c1 in ( select * from v\$sqltext
where SQL_ID = s.sql_ID order by piece) loop
dbms_output.put_line(chr(9)||c1.sql_text);
end loop;
for c1 in (
SELECT t.*
FROM v\$sql v, table(DBMS_XPLAN.DISPLAY_CURSOR(v.sql_id, v.child_number, 'TYPICAL')) t
where v.sql_id = s.sql_id
and v.loaded_versions > 0
)
loop
dbms_output.put_line(chr(9)||c1.PLAN_TABLE_OUTPUT);
end loop;
/*
SELECT *
FROM TABLE(CAST ( DBMS_XPLAN.display_cursor('s.sql_id') AS SYS.DBMS_XPLAN_TYPE_TABLE)) ;
*/
dbms_output.put_line('Previous SQL statement:');
/* for c1 in ( select * from v\$sqltext
where SQL_ID = s.PREV_SQL_ID order by piece) loop
dbms_output.put_line(chr(9)||c1.sql_text);
end loop;
*/
for c1 in (
/* SELECT * FROM TABLE(CAST ( DBMS_XPLAN.display_cursor(s.prev_sql_id) AS SYS.DBMS_XPLAN_TYPE_TABLE))
*/
SELECT tb.PLAN_TABLE_OUTPUT
FROM v\$sql v, table(CAST ( DBMS_XPLAN.DISPLAY_CURSOR(v.sql_id, v.child_number,'BASIC') AS SYS.DBMS_XPLAN_TYPE_TABLE)) tb
where v.sql_id = s.prev_sql_id
and v.loaded_versions > 0
)
loop
dbms_output.put_line(chr(9)||c1.PLAN_TABLE_OUTPUT);
end loop;
dbms_output.put_line('Session Waits:');
for c1 in ( select * from v\$session_wait where sid = s.sid) loop
dbms_output.put_line(chr(9)||c1.state||': '||c1.event);
dbms_output.put_line(chr(9)||'Wait time: '||c1.WAIT_TIME||', wait seconds: '||c1.SECONDS_IN_WAIT);
end loop;
dbms_output.put_line('Session History Waits:');
for c1 in ( select * from v\$session_wait_history where sid = s.sid order by seq# asc) loop
dbms_output.put_line(chr(9)||c1.seq#||': '||c1.event||',Wait time: '||c1.WAIT_TIME);
end loop;
dbms_output.put_line('Session Statistics:');
/* Top session
for c1 in ( select a.statistic#,a.value, b.name, b.class, b.stat_id
from V\$SESSTAT a, V\$STATNAME b
where a.STATISTIC# = b.STATISTIC# and sid = s.sid and a.value>0)
loop
dbms_output.put_line(chr(9)||c1.statistic#||': '||c1.name||': '||c1.value);
end loop;
*/
End Loop;
END;
/
exit;
+++
{code end}
Example output:
$> psql.sh 26046
SID/Serial  : 33,32215
SQL_ID     : 98g72446puumc
Foreground  : PID: 26043 - sqlplus@mydb02.abc.com (TNS V1-V3)
Shadow     : PID: 26046 - oracle@mydb02.abc.com (TNS V1-V3)
Terminal    : / UNKNOWN
OS User     : oracle on mydb02.abc.com
Ora User    : SYS
Status Flags: ACTIVE DEDICATED USER
Tran Active : 00000000D9569228
Login Time  : Monday 14:27:33
Last Call   : Monday 14:27:33 -    0.3 min
Lock/ Latch : NONE/ NONE
Latch Spin  : NONE
PGA     : 34308772
Wait     : db file scattered read: 0, Seconds: 0
Current SQL statement:
 select qt.msgid, e.local_transaction_id, e.source_commit_scn, e.
 external_source_pos, e.aq_transaction_id, e.source_transaction_i
 d, NVL(e.xidusn, 0), NVL(e.xidslt, 0), NVL(e.xidsqn, 0), NVL(e.f
 lags, 0) from "STRMADMIN"."APPLY_QUEUE_TABLE" qt, sys.apply$_err
 or e where e.apply#=:1 and qt.enq_tid(+)=e.aq_transaction_id and
  qt.q_name(+)=:2 and e.local_transaction_id=:3 order by qt.step
 _no
 SQL_ID 98g72446puumc, child number 0
 -------------------------------------
 select qt.msgid, e.local_transaction_id, e.source_commit_scn,
 e.external_source_pos, e.aq_transaction_id, e.source_transaction_id,
 NVL(e.xidusn, 0), NVL(e.xidslt, 0), NVL(e.xidsqn, 0), NVL(e.flags, 0)
 from "STRMADMIN"."APPLY_QUEUE_TABLE" qt, sys.apply$_error e where
 e.apply#=:1 and qt.enq_tid(+)=e.aq_transaction_id and qt.q_name(+)=:2
 and e.local_transaction_id=:3  order by qt.step_no
 Plan hash value: 2690713002
 ----------------------------------------------------------------------------------------------------------
 | Id  | Operation        | Name    | Rows  | Bytes | Cost (%CPU)| Time  |
 ----------------------------------------------------------------------------------------------------------
 |   0 | SELECT STATEMENT       |     |  |  |  3227 (100)|   |
 |   1 |  SORT ORDER BY        |     |     1 |   132 |  3227   (1)| 00:00:39 |
 |*  2 |   HASH JOIN OUTER       |     |     1 |   132 |  3226   (1)| 00:00:39 |
 |*  3 |    TABLE ACCESS BY INDEX ROWID| APPLY$_ERROR   |     1 |    75 |     2   (0)| 00:00:01 |
 |*  4 |     INDEX UNIQUE SCAN       | STREAMS$_APPLY_ERROR_UNQ |     1 |  |     1   (0)| 00:00:01 |
 |*  5 |    TABLE ACCESS FULL       | APPLY_QUEUE_TABLE  |   566 | 32262 |  3224   (1)| 00:00:39 |
 ----------------------------------------------------------------------------------------------------------
 Predicate Information (identified by operation id):
 ---------------------------------------------------
    2 - access("QT"."ENQ_TID"="E"."AQ_TRANSACTION_ID")
    3 - filter("E"."APPLY#"=:1)
    4 - access("E"."LOCAL_TRANSACTION_ID"=:3)
    5 - filter("QT"."Q_NAME"=:2)
 Note
 -----
    - dynamic sampling used for this statement (level=2)
Previous SQL statement:
 EXPLAINED SQL STATEMENT:
 ------------------------
 select tab.rowid, tab.msgid, tab.corrid, tab.priority, tab.delay,
 tab.expiration , tab.exception_qschema,   tab.exception_queue,
 tab.chain_no, tab.local_order_no, tab.enq_time,
 tab.time_manager_info, tab.state, tab.enq_tid, tab.step_no,
 tab.sender_name, tab.sender_address, tab.sender_protocol,
 tab.dequeue_msgid, tab.user_prop, tab.user_data  from
 "STRMADMIN"."APPLY_QUEUE_TABLE" tab  where q_name = :1 and msgid = :2
 Plan hash value: 4210003331
 ---------------------------------------------------------
 | Id  | Operation      | Name  |
 ---------------------------------------------------------
 |   0 | SELECT STATEMENT     |   |
 |   1 |  TABLE ACCESS BY INDEX ROWID| APPLY_QUEUE_TABLE |
 |   2 |   INDEX UNIQUE SCAN     | SYS_C004100 |
 ---------------------------------------------------------
Session Waits:
 WAITED SHORT TIME: db file scattered read
 Wait time: -1, wait seconds: 0
Session History Waits:
 1: db file scattered read,Wait time: 0
 2: db file scattered read,Wait time: 0
 3: db file scattered read,Wait time: 0
 4: db file scattered read,Wait time: 0
 5: db file scattered read,Wait time: 0
 6: db file scattered read,Wait time: 0
 7: db file scattered read,Wait time: 0
 8: db file scattered read,Wait time: 0
 9: db file scattered read,Wait time: 0
 10: db file scattered read,Wait time: 0
Session Statistics:
.
Next time I will show you how to troubleshooting Oracle database performance by this tool.
 
