Set echo off /*$Header: coe_sqlarea_session.sql 8.1-9.2 169630.1 2003/11/21 csierra coe $*/ SET term off; SET term off ver off feed off trims on pages 0 lin 4050 long 32767 longc 78; SET recsep off sqlp '' sqln off serveroutput on size 1000000 num 14; DEFINE p_top = 5; VARIABLE v_top NUMBER; VARIABLE v_saddr VARCHAR2(16); VARIABLE v_sid NUMBER; VARIABLE v_serial# NUMBER; VARIABLE v_paddr VARCHAR2(16); VARIABLE v_command NUMBER; VARIABLE v_taddr VARCHAR2(16); VARIABLE v_lockwait VARCHAR2(16); VARIABLE v_prev_sql_addr VARCHAR2(16); VARIABLE v_prev_hash_value NUMBER; VARIABLE v_sql_address VARCHAR2(16); VARIABLE v_sql_hash_value NUMBER; VARIABLE v_row_wait_obj# NUMBER; VARIABLE v_row_wait_file# NUMBER; VARIABLE v_row_wait_block# NUMBER; VARIABLE v_row_wait_row# NUMBER; VARIABLE v_latchwait VARCHAR2(16); VARIABLE v_latchspin VARCHAR2(16); VARIABLE v_object_owner VARCHAR2(30); VARIABLE v_object_name VARCHAR2(128); VARIABLE v_blocker_sid NUMBER; VARIABLE v_blocker_paddr VARCHAR2(16); VARIABLE v_blocker_taddr VARCHAR2(16); ALTER SESSION SET nls_date_format = 'DD-MON-YYYY HH24:MI:SS'; SET term on; PROMPT PROMPT ======================================================================== PROMPT bde_session.sql - Expensive SQL and Resource usage for one Session PROMPT ======================================================================== PROMPT PROMPT Usage: PROMPT sqlplus apps/apps PROMPT SQL> START bde_session.sql PROMPT BEGIN :v_top := TO_NUMBER('&&p_top'); SELECT saddr, sid, serial#, paddr, command, taddr, lockwait, prev_sql_addr, prev_hash_value, sql_address, sql_hash_value, row_wait_obj#, row_wait_file#, row_wait_block#, row_wait_row# INTO :v_saddr, :v_sid, :v_serial#, :v_paddr, :v_command, :v_taddr, :v_lockwait, :v_prev_sql_addr, :v_prev_hash_value, :v_sql_address, :v_sql_hash_value, :v_row_wait_obj#, :v_row_wait_file#, :v_row_wait_block#, :v_row_wait_row# FROM v$session WHERE sid = TO_NUMBER('&&sid') AND rownum = 1; SELECT latchwait, latchspin INTO :v_latchwait, :v_latchspin FROM v$process WHERE addr = :v_paddr AND rownum = 1; IF :v_row_wait_obj# = -1 THEN :v_object_owner := 'SYS'; :v_object_name := 'DUAL'; ELSE SELECT owner, object_name INTO :v_object_owner, :v_object_name FROM all_objects WHERE object_id = :v_row_wait_obj# AND rownum = 1; END IF; IF :v_lockwait IS NOT NULL THEN SELECT blocker.sid INTO :v_blocker_sid FROM v$lock blocker WHERE blocker.sid <> :v_sid AND (blocker.type, blocker.id1, blocker.id2) IN (SELECT locked.type, locked.id1, locked.id2 FROM v$lock locked WHERE locked.sid = :v_sid AND locked.kaddr = :v_lockwait) AND rownum = 1; END IF; IF :v_blocker_sid IS NOT NULL THEN SELECT paddr, taddr INTO :v_blocker_paddr, :v_blocker_taddr FROM v$session WHERE sid = :v_blocker_sid AND rownum = 1; END IF; END; / CLEAR BREAKS COLUMNS; COLUMN p_saddr NEW_VALUE p_saddr FORMAT A16; COLUMN p_sid NEW_VALUE p_sid FORMAT A8; COLUMN p_serial NEW_VALUE p_serial FORMAT A8; COLUMN p_paddr NEW_VALUE p_paddr FORMAT A16; COLUMN p_command NEW_VALUE p_command FORMAT A8; COLUMN p_taddr NEW_VALUE p_taddr FORMAT A16; COLUMN p_lockwait NEW_VALUE p_lockwait FORMAT A16; COLUMN p_prev_sql_addr NEW_VALUE p_prev_sql_addr FORMAT A16; COLUMN p_prev_hash_value NEW_VALUE p_prev_hash_value FORMAT A12; COLUMN p_sql_address NEW_VALUE p_sql_address FORMAT A16; COLUMN p_sql_hash_value NEW_VALUE p_sql_hash_value FORMAT A12; COLUMN p_row_wait_obj NEW_VALUE p_row_wait_obj FORMAT A8; COLUMN p_row_wait_file NEW_VALUE p_row_wait_file FORMAT A8; COLUMN p_row_wait_block NEW_VALUE p_row_wait_block FORMAT A8; COLUMN p_row_wait_row NEW_VALUE p_row_wait_row FORMAT A8; COLUMN p_latchwait NEW_VALUE p_latchwait FORMAT A16; COLUMN p_latchspin NEW_VALUE p_latchspin FORMAT A16; COLUMN p_object_owner NEW_VALUE p_object_owner FORMAT A30; COLUMN p_object_name NEW_VALUE p_object_name FORMAT A128; COLUMN p_blocker_sid NEW_VALUE p_blocker_sid FORMAT A8; COLUMN p_blocker_paddr NEW_VALUE p_blocker_paddr FORMAT A16; COLUMN p_blocker_taddr NEW_VALUE p_blocker_taddr FORMAT A16; COLUMN text FORMAT A78 WOR; SELECT TO_CHAR(:v_sid) p_sid, TO_CHAR(:v_serial#) p_serial, :v_saddr p_saddr, :v_paddr p_paddr, TO_CHAR(:v_command) p_command, :v_taddr p_taddr, :v_lockwait p_lockwait, :v_prev_sql_addr p_prev_sql_addr, TO_CHAR(:v_prev_hash_value) p_prev_hash_value, :v_sql_address p_sql_address, TO_CHAR(:v_sql_hash_value) p_sql_hash_value, TO_CHAR(:v_row_wait_obj#) p_row_wait_obj, TO_CHAR(:v_row_wait_file#) p_row_wait_file, TO_CHAR(:v_row_wait_block#) p_row_wait_block, TO_CHAR(:v_row_wait_row#) p_row_wait_row, :v_latchwait p_latchwait, :v_latchspin p_latchspin, :v_object_owner p_object_owner, :v_object_name p_object_name, TO_CHAR(:v_blocker_sid) p_blocker_sid, :v_blocker_paddr p_blocker_paddr, :v_blocker_taddr p_blocker_taddr FROM dual; PROMPT PROMPT Creating COE staging objects... DROP TABLE coe_sqlarea_&&p_sid; CREATE TABLE coe_sqlarea_&&p_sid (hash_value NUMBER,address RAW(20),buffer_gets$ NUMBER,disk_reads$ NUMBER, mem NUMBER,executions$ NUMBER,bg_per_exec NUMBER,dr_per_exec NUMBER, mem_per_exec NUMBER,parsing_user_id NUMBER,module VARCHAR2(64), action VARCHAR2(64),sql_text VARCHAR2(64),username VARCHAR2(30), row_num NUMBER,top_bg NUMBER,top_dr NUMBER,top_mem NUMBER,top_exec NUMBER, top_bgpe NUMBER,top_drpe NUMBER,top_mempe NUMBER, bde_x VARCHAR2(3)) NOLOGGING CACHE; DROP TABLE coe_sqltext_&&p_sid; CREATE TABLE coe_sqltext_&&p_sid (row_num NUMBER,piece NUMBER,sql_text VARCHAR2(64)) NOLOGGING CACHE; DROP TABLE coe_text_&&p_sid; CREATE TABLE coe_text_&&p_sid (row_num NUMBER,text CLOB) NOLOGGING CACHE; DROP TABLE bde_$values_&&p_sid; CREATE TABLE bde_$values_&&p_sid (column_id NUMBER,column_name VARCHAR2(30),column_values VARCHAR2(4000)) NOLOGGING CACHE; DROP TABLE bde_$selection_&&p_sid; CREATE TABLE bde_$selection_&&p_sid AS SELECT * FROM dual; PROMPT WARNING: "ORA-00942: table or view does not exist" ARE EXPECTED, PLEASE WAIT... INSERT INTO coe_sqlarea_&&p_sid SELECT sa.hash_value, sa.address, ABS(sa.buffer_gets), ABS(sa.disk_reads), ABS(sa.sharable_mem)+ABS(sa.persistent_mem)+ABS(sa.runtime_mem), ABS(sa.executions), ROUND(ABS(sa.buffer_gets)/ DECODE(NVL(ABS(sa.executions),0),0,1,ABS(sa.executions))), ROUND(ABS(sa.disk_reads)/ DECODE(NVL(ABS(sa.executions),0),0,1,ABS(sa.executions))), ROUND((ABS(sa.sharable_mem)+ABS(sa.persistent_mem)+ABS(sa.runtime_mem))/ DECODE(NVL(ABS(sa.executions),0),0,1,ABS(sa.executions))), sa.parsing_user_id, sa.module, sa.action, SUBSTR(sa.sql_text,1,64), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL FROM v$sqlarea sa, v$open_cursor oc WHERE oc.saddr = :v_saddr AND oc.sid = :v_sid AND sa.hash_value = oc.hash_value AND sa.address = oc.address; UPDATE coe_sqlarea_&&p_sid cs SET username = (SELECT username FROM all_users WHERE user_id=cs.parsing_user_id); UPDATE coe_sqlarea_&&p_sid cs SET bde_x = 'YES' WHERE ( cs.hash_value = TO_NUMBER('&&p_sql_hash_value') AND cs.address = '&&p_sql_address') OR ( cs.hash_value = TO_NUMBER('&&p_prev_hash_value') AND cs.address = '&&p_prev_sql_addr'); DECLARE c_top NUMBER; CURSOR c1 IS SELECT rowid FROM coe_sqlarea_&&p_sid ORDER BY buffer_gets$ DESC; CURSOR c2 IS SELECT rowid FROM coe_sqlarea_&&p_sid ORDER BY disk_reads$ DESC, buffer_gets$ DESC; CURSOR c3 IS SELECT rowid FROM coe_sqlarea_&&p_sid ORDER BY mem DESC, buffer_gets$ DESC; CURSOR c4 IS SELECT rowid FROM coe_sqlarea_&&p_sid ORDER BY executions$ DESC, buffer_gets$ DESC; CURSOR c5 IS SELECT rowid FROM coe_sqlarea_&&p_sid ORDER BY bg_per_exec DESC; CURSOR c6 IS SELECT rowid FROM coe_sqlarea_&&p_sid ORDER BY dr_per_exec DESC, buffer_gets$ DESC; CURSOR c7 IS SELECT rowid FROM coe_sqlarea_&&p_sid ORDER BY mem_per_exec DESC, buffer_gets$ DESC; BEGIN c_top := 1; FOR t IN c1 LOOP UPDATE coe_sqlarea_&&p_sid cs SET top_bg = c_top WHERE rowid = t.rowid; c_top := c_top+1; END LOOP; c_top := 1; FOR t IN c2 LOOP UPDATE coe_sqlarea_&&p_sid cs SET top_dr = c_top WHERE rowid = t.rowid; c_top := c_top+1; END LOOP; c_top := 1; FOR t IN c3 LOOP UPDATE coe_sqlarea_&&p_sid cs SET top_mem = c_top WHERE rowid = t.rowid; c_top := c_top+1; END LOOP; c_top := 1; FOR t IN c4 LOOP UPDATE coe_sqlarea_&&p_sid cs SET top_exec = c_top WHERE rowid = t.rowid; c_top := c_top+1; END LOOP; c_top := 1; FOR t IN c5 LOOP UPDATE coe_sqlarea_&&p_sid cs SET row_num = c_top, top_bgpe = c_top WHERE rowid = t.rowid; c_top := c_top+1; END LOOP; c_top := 1; FOR t IN c6 LOOP UPDATE coe_sqlarea_&&p_sid cs SET top_drpe = c_top WHERE rowid = t.rowid; c_top := c_top+1; END LOOP; c_top := 1; FOR t IN c7 LOOP UPDATE coe_sqlarea_&&p_sid cs SET top_mempe = c_top WHERE rowid = t.rowid; c_top := c_top+1; END LOOP; END; / UPDATE coe_sqlarea_&&p_sid cs SET cs.bde_x = 'YES' WHERE cs.top_bgpe < :v_top+1 AND cs.username <> 'SYS' AND NOT UPPER(cs.sql_text) LIKE '%BEGIN%' AND NOT UPPER(cs.sql_text) LIKE '%DECLARE%'; CREATE OR REPLACE PACKAGE bde_$v2_&&p_sid AS PROCEDURE format_values ( num_rows_in IN NUMBER, column_length_in IN NUMBER ); END bde_$v2_&&p_sid; / CREATE OR REPLACE PACKAGE BODY bde_$v2_&&p_sid AS PROCEDURE format_values ( num_rows_in IN NUMBER, column_length_in IN NUMBER ) IS v_sql VARCHAR2(2000); CURSOR columns_cursor IS SELECT column_name FROM bde_$values_&&p_sid; BEGIN EXECUTE IMMEDIATE 'ALTER TABLE bde_$selection_&&p_sid CACHE'; EXECUTE IMMEDIATE 'TRUNCATE TABLE bde_$values_&&p_sid'; EXECUTE IMMEDIATE 'INSERT INTO bde_$values_&&p_sid '|| 'SELECT column_id, column_name, NULL '|| 'FROM user_tab_columns '|| 'WHERE table_name = ''BDE_$SELECTION_&&p_sid'''; FOR i IN 1..num_rows_in LOOP FOR columns_record IN columns_cursor LOOP v_sql:='UPDATE bde_$values_&&p_sid '|| 'SET column_values = column_values || '|| '( SELECT RPAD(SUBSTR("'||columns_record.column_name|| '",1,'||TO_CHAR(column_length_in)||')||'' '','|| TO_CHAR(column_length_in+1)||') '|| 'FROM bde_$selection_&&p_sid '|| 'WHERE row_$num = '||TO_CHAR(i)||' ) '|| 'WHERE column_name = '''||columns_record.column_name||''''; BEGIN EXECUTE IMMEDIATE v_sql; EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(SUBSTR('*** ERROR: '||v_sql,1,255)); END; END LOOP; END LOOP; END format_values; END bde_$v2_&&p_sid; / SET term on; PROMPT PROMPT Storing SQL Text of selected statements into staging table... SET term off; INSERT INTO coe_sqltext_&&p_sid SELECT DISTINCT cs.row_num, st.piece, st.sql_text FROM coe_sqlarea_&&p_sid cs, v$sqltext st WHERE ( cs.top_bg <= :v_top OR cs.top_dr <= :v_top OR cs.top_mem <= :v_top OR cs.top_exec <= :v_top OR cs.top_bgpe <= :v_top OR cs.top_drpe <= :v_top OR cs.top_mempe <= :v_top OR cs.bde_x = 'YES' ) AND cs.hash_value = st.hash_value AND cs.address = st.address; SET term on; PROMPT PROMPT Massaging SQL Text of expensive SQL (Top LR) to create Text files... SET term off; DECLARE c_rownum NUMBER; c_text VARCHAR2(32767); CURSOR c1 IS SELECT row_num FROM coe_sqlarea_&&p_sid WHERE bde_x = 'YES' ORDER BY row_num; CURSOR c2 IS SELECT sql_text FROM coe_sqltext_&&p_sid WHERE row_num = c_rownum ORDER BY piece; BEGIN FOR t1 IN c1 LOOP c_rownum := t1.row_num; c_text := NULL; FOR t2 IN c2 LOOP c_text := c_text||t2.sql_text; END LOOP; INSERT INTO coe_text_&&p_sid VALUES (t1.row_num,c_text); END LOOP; END; / COMMIT; SET term on; PROMPT PROMPT Extracting expensive SQL (Top LR per Exec) into O/S Text files... PROMPT SET term off; SPOOL coe_sql_txt_&&p_sid..sql; DECLARE CURSOR c1 IS SELECT TO_CHAR(row_num) row_num FROM coe_sqlarea_&&p_sid WHERE bde_x = 'YES' ORDER BY row_num; BEGIN FOR t1 IN c1 LOOP DBMS_OUTPUT.PUT_LINE('SPOOL sql_'|| TO_CHAR(:v_sid)|| '_'||t1.row_num||'.txt'); DBMS_OUTPUT.PUT_LINE('SELECT text '|| 'FROM coe_text_&&p_sid '|| 'WHERE row_num = '||t1.row_num||';'); DBMS_OUTPUT.PUT_LINE('SPOOL OFF;'); END LOOP; END; / SPOOL OFF; START coe_sql_txt_&&p_sid..sql; SET term on; PROMPT PROMPT Creating bde_start_x.sql script... PROMPT SET term off; SPOOL bde_start_x_&&p_sid..sql; DECLARE CURSOR c1 IS SELECT TO_CHAR(row_num) row_num FROM coe_sqlarea_&&p_sid WHERE bde_x = 'YES' ORDER BY row_num; BEGIN FOR t1 IN c1 LOOP DBMS_OUTPUT.PUT_LINE('START bde_x.sql sql_'|| TO_CHAR(:v_sid)|| '_'||t1.row_num||'.txt;'); END LOOP; END; / SPOOL OFF; COLUMN SID FORMAT 99999999; COLUMN SESSION_ID FORMAT 9999999999; COLUMN SEQ# FORMAT 99999999; COLUMN EVENT FORMAT A40; COLUMN ORACLE_USERNAME FORMAT A15; COLUMN WAIT_TIME FORMAT 99999999 HEADING 'WAIT|TIME'; COLUMN SECONDS_IN_WAIT FORMAT 99999999 HEADING 'SECONDS|IN WAIT'; COLUMN CLASS FORMAT A20; COLUMN XIDUSN FORMAT 99999999; COLUMN XIDSLOT FORMAT 99999999; COLUMN XIDSQN FORMAT 99999999; COLUMN OBJECT_NAME FORMAT A50; COLUMN BUFFER_GETS$ FORMAT 99,999,999,999 - HEADING 'Total|Logical Reads|(Buffer Gets)'; COLUMN DISK_READS$ FORMAT 99,999,999,999 - HEADING 'Total|Physical Reads|(Disk Reads)'; COLUMN MEM FORMAT 99,999,999,999 - HEADING 'Total|Memory|(bytes)'; COLUMN EXECUTIONS$ FORMAT 99,999,999,999 - HEADING 'Total|Number of|Executions'; COLUMN BG_PER_EXEC FORMAT 99,999,999,999 - HEADING 'Logical Reads|per Execution|(db blocks)'; COLUMN DR_PER_EXEC FORMAT 99,999,999,999 - HEADING 'Physical Reads|per Execution|(db blocks)'; COLUMN MEM_PER_EXEC FORMAT 99,999,999,999 - HEADING 'Memory|per Execution|(bytes)'; COLUMN TOP_BGPE FORMAT 9999 - HEADING 'Top|LR|per|Exec'; COLUMN TOP_DRPE FORMAT 9999 - HEADING 'Top|PR|per|Exec'; COLUMN TOP_MEMPE FORMAT 9999 - HEADING 'Top|Mem|per|Exec'; COLUMN TOP_EXEC FORMAT 9999 - HEADING 'Top|Num|of|Exec'; COLUMN TOP_BG FORMAT 9999 - HEADING 'Top|Logc|Read|LR' COLUMN TOP_DR FORMAT 9999 - HEADING 'Top|Phys|Read|PR'; COLUMN TOP_MEM FORMAT 9999 - HEADING 'Top|Mem'; COLUMN ROW_NUM FORMAT 999999 HEADING 'SQL ID'; COLUMN USERNAME FORMAT A10 HEADING 'User'; COLUMN MODULE_ACTION FORMAT A50 HEADING 'Source (Module and Action)'; COLUMN SQL_TEXT_L1 FORMAT A64 HEADING 'SQL Text (first 64 bytes)'; COLUMN SQL_TEXT FORMAT A64 HEADING 'SQL Text'; COLUMN HASH_VALUE FORMAT 999999999999999 HEADING 'Hash Value'; COLUMN SQLADDRESS FORMAT A16 HEADING 'Address'; COLUMN PIECE NOPRINT; COLUMN DUMMY NOPRINT; SET term on; PROMPT PROMPT Generating Report (bde_session_&&p_sid..txt spool file)... PROMPT PROMPT SET term off; SPOOL bde_session_&&p_sid..txt; SET term on recsep wr; SET pages 0; PROMPT bde_session.sql 8.1-9.0 169630.1 2002/06/01 SID: &&p_sid PROMPT PROMPT V$SESSION - Session ( &&p_sid &&p_blocker_sid ) PROMPT =================== PROMPT DROP TABLE bde_$selection_&&p_sid; CREATE TABLE bde_$selection_&&p_sid AS SELECT 1 row_$num, v.* FROM v$session v WHERE v.saddr = '&&p_saddr' AND v.sid = TO_NUMBER('&&p_sid') AND v.serial# = TO_NUMBER('&&p_serial') UNION ALL SELECT 2 row_$num, v.* FROM v$session v WHERE v.sid = TO_NUMBER('&&p_blocker_sid'); EXEC bde_$v2_&&p_sid..format_values(num_rows_in => 2, column_length_in => 30); SELECT SUBSTR(column_name,1,30) column_name, column_values FROM bde_$values_&&p_sid WHERE TRIM(column_values) IS NOT NULL AND column_name <> 'ROW_$NUM' ORDER BY column_id; PROMPT SELECT RPAD('COMMAND (in progress): '||TO_CHAR(action),31)||name FROM audit_actions WHERE action = :v_command; PROMPT SELECT RPAD('ROW_WAIT_OBJ#: '||TO_CHAR(:v_row_wait_obj#),31)|| owner||'.'||object_name||' ('||object_type||') ROWID: '|| DBMS_ROWID.ROWID_CREATE(1, NVL(TO_NUMBER('&&p_row_wait_obj'),0), NVL(TO_NUMBER('&&p_row_wait_file'),0), NVL(TO_NUMBER('&&p_row_wait_block'),0), NVL(TO_NUMBER('&&p_row_wait_row'),0)) FROM all_objects WHERE object_id = :v_row_wait_obj#; PROMPT DROP TABLE bde_$selection_&&p_sid; CREATE TABLE bde_$selection_&&p_sid AS SELECT rownum row_$num, v.* FROM &&p_object_owner..&&p_object_name v WHERE TO_NUMBER('&&p_row_wait_obj') <> -1 AND v.rowid = DBMS_ROWID.ROWID_CREATE(1, NVL(TO_NUMBER('&&p_row_wait_obj'),0), NVL(TO_NUMBER('&&p_row_wait_file'),0), NVL(TO_NUMBER('&&p_row_wait_block'),0), NVL(TO_NUMBER('&&p_row_wait_row'),0)); EXEC bde_$v2_&&p_sid..format_values(num_rows_in => 1, column_length_in => 150); SELECT SUBSTR(column_name,1,30) column_name, column_values FROM bde_$values_&&p_sid WHERE TRIM(column_values) IS NOT NULL AND column_name <> 'ROW_$NUM' ORDER BY column_id; SET pages 1000; PROMPT PROMPT PROMPT V$LOCK - Locks ( &&p_lockwait &&p_sid &&p_blocker_sid ) PROMPT ============== SELECT * FROM v$lock WHERE sid IN (:v_sid, :v_blocker_sid) ORDER BY DECODE(sid,:v_sid,1,2), type, id1, id2; PROMPT PROMPT LMODE/REQUEST on V$LOCK rows ( &&p_sid &&p_blocker_sid ) PROMPT ============================ PROMPT 0: None PROMPT 1: Null (NULL) PROMPT 2: Row-S (SS) Row Share PROMPT 3: Row-X (SX) Row Exclusive PROMPT 4: Share (S) Share PROMPT 5: S/Row-X (SSX) Share/Row Exclusive PROMPT 6: Exclusive (X) PROMPT PROMPT PROMPT V$LOCKED_OBJECT - Locked Objects ( &&p_sid &&p_blocker_sid ) PROMPT ================================ SELECT l.*, o.owner||'.'||o.object_name object_name FROM v$locked_object l, all_objects o WHERE l.session_id IN (:v_sid, :v_blocker_sid) AND l.object_id = o.object_id ORDER BY DECODE(l.session_id,:v_sid,1,2), l.xidusn, l.xidslot, l.xidsqn; PROMPT PROMPT PROMPT V$SESSION_EVENT - Waits for an Event ( &&p_sid &&p_blocker_sid ) PROMPT ==================================== SELECT * FROM v$session_event WHERE sid IN (:v_sid, :v_blocker_sid) ORDER BY DECODE(sid,:v_sid,1,2), event; PROMPT PROMPT PROMPT V$SESSION_WAIT - Resources or Events waiting for ( &&p_sid &&p_blocker_sid ) PROMPT ================================================ SELECT sid, seq#, event, p1raw, p2raw, p3raw, p1, p2, p3, wait_time, seconds_in_wait, state FROM v$session_wait WHERE sid IN (:v_sid, :v_blocker_sid) ORDER BY DECODE(sid,:v_sid,1,2), event; PROMPT PROMPT PROMPT V$SESSTAT - Session Statistics ( &&p_sid &&p_blocker_sid ) PROMPT ============================== SELECT s.sid, s.value, n.name, TO_CHAR(n.class)|| DECODE(n.class,1,' User',2,' Redo',4,' Enqueue',8,' Cache', 16,' OS',32,' Parallel Server',64,' SQL',128,' Debug', 72,' Cache + SQL', NULL) class FROM v$sesstat s, v$statname n WHERE s.statistic# = n.statistic# AND s.value <> 0 AND s.sid IN (:v_sid, :v_blocker_sid) ORDER BY DECODE(s.sid,:v_sid,1,2), n.name; SET pages 0; PROMPT PROMPT PROMPT V$SQLAREA - Currently Executing ( &&p_sql_address &&p_sql_hash_value ) PROMPT =============================== PROMPT DROP TABLE bde_$selection_&&p_sid; CREATE TABLE bde_$selection_&&p_sid AS SELECT rownum row_$num, '&&p_sid' sid, v.* FROM v$sqlarea v WHERE v.address = '&&p_sql_address' AND v.hash_value = TO_NUMBER('&&p_sql_hash_value'); EXEC bde_$v2_&&p_sid..format_values(num_rows_in => 1, column_length_in => 1000); SELECT column_values text FROM bde_$values_&&p_sid WHERE column_name = 'SQL_TEXT'; SELECT SUBSTR(column_name,1,30) column_name, column_values FROM bde_$values_&&p_sid WHERE TRIM(column_values) IS NOT NULL AND column_name NOT IN ('ROW_$NUM', 'SQL_TEXT') ORDER BY column_id; PROMPT PROMPT PROMPT V$SQLAREA - Previous Execution ( &&p_prev_sql_addr &&p_prev_hash_value ) PROMPT ============================== PROMPT DROP TABLE bde_$selection_&&p_sid; CREATE TABLE bde_$selection_&&p_sid AS SELECT rownum row_$num, '&&p_sid' sid, v.* FROM v$sqlarea v WHERE v.address = '&&p_prev_sql_addr' AND v.hash_value = TO_NUMBER('&&p_prev_hash_value'); EXEC bde_$v2_&&p_sid..format_values(num_rows_in => 1, column_length_in => 1000); SELECT column_values text FROM bde_$values_&&p_sid WHERE column_name = 'SQL_TEXT'; SELECT SUBSTR(column_name,1,30) column_name, column_values FROM bde_$values_&&p_sid WHERE TRIM(column_values) IS NOT NULL AND column_name NOT IN ('ROW_$NUM', 'SQL_TEXT') ORDER BY column_id; PROMPT PROMPT PROMPT V$PROCESS - Process ( &&p_sid &&p_paddr &&p_blocker_sid &&p_blocker_paddr ) PROMPT =================== PROMPT DROP TABLE bde_$selection_&&p_sid; CREATE TABLE bde_$selection_&&p_sid AS SELECT 1 row_$num, '&&p_sid' sid, v.* FROM v$process v WHERE v.addr = '&&p_paddr' UNION ALL SELECT 2 row_$num, '&&p_blocker_sid' sid, v.* FROM v$process v WHERE v.addr = '&&p_blocker_paddr'; EXEC bde_$v2_&&p_sid..format_values(num_rows_in => 2, column_length_in => 30); SELECT SUBSTR(column_name,1,30) column_name, column_values FROM bde_$values_&&p_sid WHERE TRIM(column_values) IS NOT NULL AND column_name <> 'ROW_$NUM' ORDER BY column_id; PROMPT PROMPT PROMPT V$TRANSACTION - Transaction ( &&p_sid &&p_taddr &&p_blocker_sid &&p_blocker_taddr ) PROMPT =========================== PROMPT DROP TABLE bde_$selection_&&p_sid; CREATE TABLE bde_$selection_&&p_sid AS SELECT 1 row_$num, '&&p_sid' sid, v.* FROM v$transaction v WHERE v.addr = '&&p_taddr' UNION ALL SELECT 2 row_$num, '&&p_blocker_sid' sid, v.* FROM v$transaction v WHERE v.addr = '&&p_blocker_taddr'; EXEC bde_$v2_&&p_sid..format_values(num_rows_in => 2, column_length_in => 30); SELECT SUBSTR(column_name,1,30) column_name, column_values FROM bde_$values_&&p_sid WHERE TRIM(column_values) IS NOT NULL AND column_name <> 'ROW_$NUM' ORDER BY column_id; SET pages 10000; PROMPT PROMPT Summary of SQL Statements linked to Session ( &&p_sid ) PROMPT =========================================== SELECT cs.row_num, cs.bg_per_exec, cs.dr_per_exec, cs.mem_per_exec, cs.executions$, cs.buffer_gets$, cs.disk_reads$, cs.mem, cs.top_bgpe, cs.top_drpe, cs.top_mempe, cs.top_exec, cs.top_bg, cs.top_dr, cs.top_mem FROM coe_sqlarea_&&p_sid cs ORDER BY cs.row_num; SELECT cs.row_num, sql_text sql_text_l1, SUBSTR(username,1,10) username, cs.hash_value, cs.address sqladdress, SUBSTR(module||' '||action,1,80) module_action FROM coe_sqlarea_&&p_sid cs ORDER BY cs.row_num; SET pages 0; PROMPT PROMPT PROMPT Top SQL in terms of Logical Reads per Execution ( &&p_sid ) PROMPT =============================================== PROMPT DROP TABLE bde_$selection_&&p_sid; CREATE TABLE bde_$selection_&&p_sid AS SELECT cs.top_bgpe row_$num, cs.bg_per_exec, cs.row_num sql_id, v.* FROM coe_sqlarea_&&p_sid cs, v$sqlarea v WHERE cs.top_bgpe <= TO_NUMBER('&&p_top') AND cs.hash_value = v.hash_value AND cs.address = v.address ORDER BY cs.top_bgpe; EXEC bde_$v2_&&p_sid..format_values(num_rows_in => :v_top, column_length_in => 30); SELECT SUBSTR(column_name,1,30) column_name, column_values FROM bde_$values_&&p_sid WHERE TRIM(column_values) IS NOT NULL ORDER BY column_id; PROMPT PROMPT PROMPT Top SQL in terms of Physical Reads per Execution ( &&p_sid ) PROMPT ================================================ PROMPT DROP TABLE bde_$selection_&&p_sid; CREATE TABLE bde_$selection_&&p_sid AS SELECT cs.top_drpe row_$num, cs.dr_per_exec, cs.row_num sql_id, v.* FROM coe_sqlarea_&&p_sid cs, v$sqlarea v WHERE cs.top_drpe <= TO_NUMBER('&&p_top') AND cs.hash_value = v.hash_value AND cs.address = v.address ORDER BY cs.top_drpe; EXEC bde_$v2_&&p_sid..format_values(num_rows_in => :v_top, column_length_in => 30); SELECT SUBSTR(column_name,1,30) column_name, column_values FROM bde_$values_&&p_sid WHERE TRIM(column_values) IS NOT NULL ORDER BY column_id; PROMPT PROMPT PROMPT Top SQL in terms of Memory per Execution ( &&p_sid ) PROMPT ======================================== PROMPT DROP TABLE bde_$selection_&&p_sid; CREATE TABLE bde_$selection_&&p_sid AS SELECT cs.top_mempe row_$num, cs.mem_per_exec, cs.row_num sql_id, v.* FROM coe_sqlarea_&&p_sid cs, v$sqlarea v WHERE cs.top_mempe <= TO_NUMBER('&&p_top') AND cs.hash_value = v.hash_value AND cs.address = v.address ORDER BY cs.top_mempe; EXEC bde_$v2_&&p_sid..format_values(num_rows_in => :v_top, column_length_in => 30); SELECT SUBSTR(column_name,1,30) column_name, column_values FROM bde_$values_&&p_sid WHERE TRIM(column_values) IS NOT NULL ORDER BY column_id; PROMPT PROMPT PROMPT Top SQL in terms of Total Number of Executions ( &&p_sid ) PROMPT ============================================== PROMPT DROP TABLE bde_$selection_&&p_sid; CREATE TABLE bde_$selection_&&p_sid AS SELECT cs.top_exec row_$num, cs.executions$, cs.row_num sql_id, v.* FROM coe_sqlarea_&&p_sid cs, v$sqlarea v WHERE cs.top_exec <= TO_NUMBER('&&p_top') AND cs.hash_value = v.hash_value AND cs.address = v.address ORDER BY cs.top_exec; EXEC bde_$v2_&&p_sid..format_values(num_rows_in => :v_top, column_length_in => 30); SELECT SUBSTR(column_name,1,30) column_name, column_values FROM bde_$values_&&p_sid WHERE TRIM(column_values) IS NOT NULL ORDER BY column_id; PROMPT PROMPT PROMPT Top SQL in terms of Total Logical Reads ( &&p_sid ) PROMPT ======================================= PROMPT DROP TABLE bde_$selection_&&p_sid; CREATE TABLE bde_$selection_&&p_sid AS SELECT cs.top_bg row_$num, cs.buffer_gets$, cs.row_num sql_id, v.* FROM coe_sqlarea_&&p_sid cs, v$sqlarea v WHERE cs.top_bg <= TO_NUMBER('&&p_top') AND cs.hash_value = v.hash_value AND cs.address = v.address ORDER BY cs.top_bg; EXEC bde_$v2_&&p_sid..format_values(num_rows_in => :v_top, column_length_in => 30); SELECT SUBSTR(column_name,1,30) column_name, column_values FROM bde_$values_&&p_sid WHERE TRIM(column_values) IS NOT NULL ORDER BY column_id; PROMPT PROMPT PROMPT Top SQL in terms of Total Physical Reads ( &&p_sid ) PROMPT ======================================== PROMPT DROP TABLE bde_$selection_&&p_sid; CREATE TABLE bde_$selection_&&p_sid AS SELECT cs.top_dr row_$num, cs.disk_reads$, cs.row_num sql_id, v.* FROM coe_sqlarea_&&p_sid cs, v$sqlarea v WHERE cs.top_dr <= TO_NUMBER('&&p_top') AND cs.hash_value = v.hash_value AND cs.address = v.address ORDER BY cs.top_dr; EXEC bde_$v2_&&p_sid..format_values(num_rows_in => :v_top, column_length_in => 30); SELECT SUBSTR(column_name,1,30) column_name, column_values FROM bde_$values_&&p_sid WHERE TRIM(column_values) IS NOT NULL ORDER BY column_id; PROMPT PROMPT PROMPT Top SQL in terms of Total Memomy ( &&p_sid ) PROMPT ================================ PROMPT DROP TABLE bde_$selection_&&p_sid; CREATE TABLE bde_$selection_&&p_sid AS SELECT cs.top_mem row_$num, cs.mem, cs.row_num sql_id, v.* FROM coe_sqlarea_&&p_sid cs, v$sqlarea v WHERE cs.top_mem <= TO_NUMBER('&&p_top') AND cs.hash_value = v.hash_value AND cs.address = v.address ORDER BY cs.top_mem; EXEC bde_$v2_&&p_sid..format_values(num_rows_in => :v_top, column_length_in => 30); SELECT SUBSTR(column_name,1,30) column_name, column_values FROM bde_$values_&&p_sid WHERE TRIM(column_values) IS NOT NULL ORDER BY column_id; SET pages 10000; PROMPT PROMPT PROMPT Full text of identified expensive SQL Statements ordered by SQL ID ( &&p_sid ) PROMPT ================================================================== BREAK ON ROW_NUM SKIP 1; SELECT csa.row_num, cst.piece, cst.sql_text FROM coe_sqlarea_&&p_sid csa, coe_sqltext_&&p_sid cst WHERE csa.row_num = cst.row_num ORDER BY csa.row_num, cst.piece; PROMPT PROMPT bde_session_&&p_sid..txt has been generated. PROMPT PROMPT Recover the bde_session_&&p_sid..txt spool file. PROMPT Consolidate and compress together with other files generated into same directory. PROMPT Upload consolidated/compressed file bde_results.zip file for further analysis. PROMPT On NT, files may get created under $ORACLE_HOME/bin. PROMPT SPOOL off; DROP PACKAGE bde_$v2_&&p_sid; DROP TABLE coe_sqlarea_&&p_sid; DROP TABLE coe_sqltext_&&p_sid; DROP TABLE coe_text_&&p_sid; DROP TABLE bde_$values_&&p_sid; DROP TABLE bde_$selection_&&p_sid; SET ver on feed on trims off long 80 pages 24 lin 80 feed on; SET sqlp SQL> sqln on serveroutput off num 10; CLEAR BREAKS COLUMNS; PROMPT PROMPT Executing bde_x.sql for Expensive SQL statements PROMPT START bde_start_x_&&p_sid..sql; PROMPT COLUMN ENDEDSE FORMAT A21 HEADING 'bde_session.sql ended'; SELECT TO_CHAR(sysdate,'YYYY-MM-DD HH24:MI:SS') endedse FROM sys.dual;