---------------------------------------------------------------------------------------- -- -- File name: cs_sessions.sql -- -- Purpose: Simple list all current Sessions (all types and all statuses) -- -- Author: Carlos Sierra -- -- Version: 2022/10/05 -- -- Usage: Execute connected to CDB or PDB. -- -- Example: $ sqlplus / as sysdba -- SQL> @cs_sessions.sql -- -- Notes: Developed and tested on 12.1.0.2 and 19c. -- --------------------------------------------------------------------------------------- -- @@cs_internal/cs_primary.sql @@cs_internal/cs_cdb_warn.sql @@cs_internal/cs_set.sql @@cs_internal/cs_def.sql @@cs_internal/cs_file_prefix.sql -- DEF cs_script_name = 'cs_sessions'; -- SELECT '&&cs_file_prefix._&&cs_script_name.' cs_file_name FROM DUAL; -- @@cs_internal/cs_spool_head.sql PRO SQL> @&&cs_script_name..sql @@cs_internal/cs_spool_id.sql -- COL status FOR A8 PRI; COL last_call_et FOR 999,999,999,990 HEA 'LAST_CALL|ET_SECS'; COL logon_age FOR 999,999,990 HEA 'LOGON|AGE_SECS'; COL sid_serial FOR A12; COL blocker FOR 9999990; COL module_action_program FOR A50 TRUNC; COL module FOR A40 TRUNC; COL sql_text FOR A50 TRUNC; COL pdb_name FOR A35 TRUNC; COL timed_event FOR A60 HEA 'TIMED EVENT' TRUNC; COL type FOR A10 TRUNC; COL username FOR A20 TRUNC; COL txn FOR A3; COL last_call_time FOR A19; COL logon_time FOR A19; COL service_name FOR A50; -- SET FEED ON; DEF cs_session_type = 'BACKGROUND' PRO PRO SESSIONS: &&cs_session_type. PRO ~~~~~~~~ WITH v_session AS ( SELECT /*+ MATERIALIZE NO_MERGE */ * FROM v$session WHERE &&cs_con_id. IN (1, con_id) AND type = '&&cs_session_type.' ), sessions AS ( SELECT /*+ MATERIALIZE NO_MERGE */ con_id, sid, serial#, CASE WHEN final_blocking_session_status = 'VALID' THEN final_blocking_session END AS blocker, -- type, status, username, paddr, taddr, logon_time, last_call_et, (SYSDATE - logon_time) * 24 * 3600 AS logon_age, COALESCE(sql_id, prev_sql_id) sql_id, machine, 's:'||state|| CASE WHEN wait_class IS NOT NULL THEN ' w:'||wait_class END|| CASE WHEN event IS NOT NULL THEN ' - '||event END AS timed_event, CASE WHEN TRIM(module) IS NOT NULL THEN 'm:'||TRIM(module)||' ' END|| CASE WHEN TRIM(action) IS NOT NULL THEN 'a:'||TRIM(action)||' ' END|| CASE WHEN TRIM(program) IS NOT NULL THEN 'p:'||TRIM(program) END AS module_action_program, service_name FROM v_session ) SELECT se.last_call_et, (SYSDATE - (se.last_call_et / 3600 / 24)) AS last_call_time, se.logon_age, se.logon_time, se.sid||','||se.serial# sid_serial, se.blocker, -- se.type, se.status, se.username, CASE WHEN se.taddr IS NOT NULL THEN 'TXN' END AS txn, se.timed_event, se.sql_id, (SELECT sql_text FROM v$sql sq WHERE sq.sql_id = se.sql_id AND ROWNUM = 1) sql_text, se.machine, se.module_action_program, c.name||'('||se.con_id||')' AS pdb_name, se.service_name FROM sessions se, v$containers c WHERE c.con_id(+) = se.con_id AND c.open_mode(+) = 'READ WRITE' ORDER BY se.last_call_et, se.logon_age, se.sid, se.serial# / -- DEF cs_session_type = 'USER' PRO PRO SESSIONS: &&cs_session_type. PRO ~~~~~~~~ / SET FEED OFF; -- COL pdb FOR A35; COL total_pdbs FOR 9,990 HEA 'TOTAL|PDBs'; COL total_sessions FOR 99999999 HEA 'TOTAL|SESSIONS'; COL status_active FOR 999999 HEA 'STATUS|ACTIVE'; COL status_inactive FOR 99999999 HEA 'STATUS|INACTIVE'; COL type_user FOR 999999 HEA 'TYPE|USER'; COL type_background FOR 9999999999 HEA 'TYPE|BACKGROUND'; COL type_recursive FOR 9999999999 HEA 'TYPE|RECURSIVE'; COL user_active FOR 999999 HEA 'USER|ACTIVE'; COL user_inactive FOR 99999999 HEA 'USER|INACTIVE'; COL user_active_cpu FOR 999999 HEA 'USER|ACTIVE|ON_CPU'; COL user_active_txn FOR 999999 HEA 'USER|ACTIVE|TXN'; COL user_inactive_txn FOR 999999 HEA 'USER|INACTIVE|TXN'; COL user_active_waiting FOR 9999999 HEA 'USER|ACTIVE|WAITING'; COL user_scheduler FOR 999999999 HEA 'USER|ACTIVE|WAITING|SCHEDULER'; COL user_io FOR 99999999 HEA 'USER|ACTIVE|WAITING|USER_I/O'; COL user_application FOR 99999999999 HEA 'USER|ACTIVE|WAITING|APPLICATION'; COL user_concurency FOR 99999999999 HEA 'USER|ACTIVE|WAITING|CONCURRENCY'; COL user_commit FOR 9999999 HEA 'USER|ACTIVE|WAITING|COMMIT'; COL last_call_secs FOR 999,999,990 HEA 'LAST_CALL|SECONDS'; COL avg_last_call_secs FOR 999,999,990 HEA 'AVG_LAST_CALL|SECONDS'; -- -- COL pdb FOR A35; -- COL total_sessions FOR 99999999 HEA 'TOTAL|SESSIONS'; -- COL status_active FOR 999999 HEA 'STATUS|ACTIVE'; -- COL status_inactive FOR 99999999 HEA 'STATUS|INACTIVE'; -- COL type_user FOR 999999 HEA 'TYPE|USER'; -- COL type_background FOR 9999999999 HEA 'TYPE|BACKGROUND'; -- COL type_recursive FOR 9999999999 HEA 'TYPE|RECURSIVE'; -- COL user_active FOR 999999 HEA 'USER|ACTIVE'; -- COL user_inactive FOR 99999999 HEA 'USER|INACTIVE'; -- COL user_active_cpu FOR 999999 HEA 'USER|ACTIVE|ON_CPU'; -- COL user_active_txn FOR 999999 HEA 'USER|ACTIVE|TXN'; -- COL user_inactive_txn FOR 999999 HEA 'USER|INACTIVE|TXN'; -- COL user_active_waiting FOR 9999999 HEA 'USER|ACTIVE|WAITING'; -- COL user_scheduler FOR 999999999 HEA 'USER|ACTIVE|WAITING|SCHEDULER'; -- COL user_io FOR 99999999 HEA 'USER|ACTIVE|WAITING|USER_I/O'; -- COL user_application FOR 99999999999 HEA 'USER|ACTIVE|WAITING|APPLICATION'; -- COL user_concurency FOR 99999999999 HEA 'USER|ACTIVE|WAITING|CONCURRENCY'; -- COL user_commit FOR 9999999 HEA 'USER|ACTIVE|WAITING|COMMIT'; -- COL last_call_secs FOR 999,999,990 HEA 'LAST_CALL|SECONDS'; -- COL avg_last_call_secs FOR 999,999,990 HEA 'AVG_LAST_CALL|SECONDS'; -- BREAK ON REPORT; COMPUTE SUM LABEL 'TOTAL' OF total_sessions status_active status_inactive type_user type_background type_recursive user_active user_inactive user_active_txn user_inactive_txn user_active_cpu user_active_waiting user_scheduler user_io user_application user_concurency user_commit ON REPORT; -- PRO PRO MACHINE and MODULE SUMMARY PRO ~~~~~~~~~~~~~~~~~~~~~~~~~~ WITH all_sessions AS ( SELECT /*+ MATERIALIZE NO_MERGE */ * FROM v$session WHERE &&cs_con_id. IN (1, con_id) ), sessions AS ( SELECT /*+ MATERIALIZE NO_MERGE */ machine, module, COUNT(DISTINCT con_id) AS total_pdbs, COUNT(*) total_sessions, SUM(CASE WHEN type = 'USER' THEN 1 ELSE 0 END) type_user, SUM(CASE WHEN type = 'BACKGROUND' THEN 1 ELSE 0 END) type_background, --SUM(CASE WHEN type = 'RECURSIVE' THEN 1 ELSE 0 END) type_recursive, SUM(CASE WHEN status = 'ACTIVE' THEN 1 ELSE 0 END) status_active, SUM(CASE WHEN status = 'INACTIVE' THEN 1 ELSE 0 END) status_inactive, SUM(CASE WHEN status = 'ACTIVE' AND type = 'USER' THEN 1 ELSE 0 END) user_active, SUM(CASE WHEN status = 'INACTIVE' AND type = 'USER' THEN 1 ELSE 0 END) user_inactive, SUM(CASE WHEN type = 'USER' AND status = 'ACTIVE' AND state <> 'WAITING' THEN 1 ELSE 0 END) user_active_cpu, SUM(CASE WHEN type = 'USER' AND status = 'ACTIVE' AND state = 'WAITING' THEN 1 ELSE 0 END) user_active_waiting, SUM(CASE WHEN type = 'USER' AND status = 'ACTIVE' AND taddr IS NOT NULL THEN 1 ELSE 0 END) user_active_txn, SUM(CASE WHEN type = 'USER' AND status = 'INACTIVE' AND taddr IS NOT NULL THEN 1 ELSE 0 END) user_inactive_txn, SUM(CASE WHEN type = 'USER' AND status = 'ACTIVE' AND state = 'WAITING' AND wait_class = 'Scheduler' THEN 1 ELSE 0 END) user_scheduler, SUM(CASE WHEN type = 'USER' AND status = 'ACTIVE' AND state = 'WAITING' AND wait_class = 'User I/O' THEN 1 ELSE 0 END) user_io, SUM(CASE WHEN type = 'USER' AND status = 'ACTIVE' AND state = 'WAITING' AND wait_class = 'Application' THEN 1 ELSE 0 END) user_application, SUM(CASE WHEN type = 'USER' AND status = 'ACTIVE' AND state = 'WAITING' AND wait_class = 'Concurrency' THEN 1 ELSE 0 END) user_concurency, SUM(CASE WHEN type = 'USER' AND status = 'ACTIVE' AND state = 'WAITING' AND wait_class = 'Commit' THEN 1 ELSE 0 END) user_commit, MIN(last_call_et) last_call_secs, ROUND(AVG(last_call_et)) avg_last_call_secs FROM all_sessions GROUP BY machine, module ) SELECT s.machine, s.module, s.total_pdbs, s.total_sessions, s.type_user, s.type_background, --s.type_recursive, s.status_active, s.status_inactive, s.user_active, s.user_inactive, s.user_active_cpu, s.user_active_waiting, s.user_active_txn, s.user_inactive_txn, s.user_scheduler, s.user_io, s.user_application, s.user_concurency, s.user_commit, s.last_call_secs, s.avg_last_call_secs FROM sessions s ORDER BY s.machine, s.module / PRO PRO MACHINE SUMMARY PRO ~~~~~~~~~~~~~~~ WITH all_sessions AS ( SELECT /*+ MATERIALIZE NO_MERGE */ * FROM v$session WHERE &&cs_con_id. IN (1, con_id) ), sessions AS ( SELECT /*+ MATERIALIZE NO_MERGE */ machine, COUNT(DISTINCT con_id) AS total_pdbs, COUNT(*) total_sessions, SUM(CASE WHEN type = 'USER' THEN 1 ELSE 0 END) type_user, SUM(CASE WHEN type = 'BACKGROUND' THEN 1 ELSE 0 END) type_background, --SUM(CASE WHEN type = 'RECURSIVE' THEN 1 ELSE 0 END) type_recursive, SUM(CASE WHEN status = 'ACTIVE' THEN 1 ELSE 0 END) status_active, SUM(CASE WHEN status = 'INACTIVE' THEN 1 ELSE 0 END) status_inactive, SUM(CASE WHEN status = 'ACTIVE' AND type = 'USER' THEN 1 ELSE 0 END) user_active, SUM(CASE WHEN status = 'INACTIVE' AND type = 'USER' THEN 1 ELSE 0 END) user_inactive, SUM(CASE WHEN type = 'USER' AND status = 'ACTIVE' AND state <> 'WAITING' THEN 1 ELSE 0 END) user_active_cpu, SUM(CASE WHEN type = 'USER' AND status = 'ACTIVE' AND state = 'WAITING' THEN 1 ELSE 0 END) user_active_waiting, SUM(CASE WHEN type = 'USER' AND status = 'ACTIVE' AND taddr IS NOT NULL THEN 1 ELSE 0 END) user_active_txn, SUM(CASE WHEN type = 'USER' AND status = 'INACTIVE' AND taddr IS NOT NULL THEN 1 ELSE 0 END) user_inactive_txn, SUM(CASE WHEN type = 'USER' AND status = 'ACTIVE' AND state = 'WAITING' AND wait_class = 'Scheduler' THEN 1 ELSE 0 END) user_scheduler, SUM(CASE WHEN type = 'USER' AND status = 'ACTIVE' AND state = 'WAITING' AND wait_class = 'User I/O' THEN 1 ELSE 0 END) user_io, SUM(CASE WHEN type = 'USER' AND status = 'ACTIVE' AND state = 'WAITING' AND wait_class = 'Application' THEN 1 ELSE 0 END) user_application, SUM(CASE WHEN type = 'USER' AND status = 'ACTIVE' AND state = 'WAITING' AND wait_class = 'Concurrency' THEN 1 ELSE 0 END) user_concurency, SUM(CASE WHEN type = 'USER' AND status = 'ACTIVE' AND state = 'WAITING' AND wait_class = 'Commit' THEN 1 ELSE 0 END) user_commit, MIN(last_call_et) last_call_secs, ROUND(AVG(last_call_et)) avg_last_call_secs FROM all_sessions GROUP BY machine ) SELECT s.machine, s.total_pdbs, s.total_sessions, s.type_user, s.type_background, --s.type_recursive, s.status_active, s.status_inactive, s.user_active, s.user_inactive, s.user_active_cpu, s.user_active_waiting, s.user_active_txn, s.user_inactive_txn, s.user_scheduler, s.user_io, s.user_application, s.user_concurency, s.user_commit, s.last_call_secs, s.avg_last_call_secs FROM sessions s ORDER BY s.machine / PRO PRO PDB SUMMARY PRO ~~~~~~~~~~~ WITH all_sessions AS ( SELECT /*+ MATERIALIZE NO_MERGE */ * FROM v$session WHERE &&cs_con_id. IN (1, con_id) ), sessions AS ( SELECT /*+ MATERIALIZE NO_MERGE */ con_id, COUNT(*) total_sessions, SUM(CASE WHEN type = 'USER' THEN 1 ELSE 0 END) type_user, SUM(CASE WHEN type = 'BACKGROUND' THEN 1 ELSE 0 END) type_background, --SUM(CASE WHEN type = 'RECURSIVE' THEN 1 ELSE 0 END) type_recursive, SUM(CASE WHEN status = 'ACTIVE' THEN 1 ELSE 0 END) status_active, SUM(CASE WHEN status = 'INACTIVE' THEN 1 ELSE 0 END) status_inactive, SUM(CASE WHEN status = 'ACTIVE' AND type = 'USER' THEN 1 ELSE 0 END) user_active, SUM(CASE WHEN status = 'INACTIVE' AND type = 'USER' THEN 1 ELSE 0 END) user_inactive, SUM(CASE WHEN type = 'USER' AND status = 'ACTIVE' AND state <> 'WAITING' THEN 1 ELSE 0 END) user_active_cpu, SUM(CASE WHEN type = 'USER' AND status = 'ACTIVE' AND state = 'WAITING' THEN 1 ELSE 0 END) user_active_waiting, SUM(CASE WHEN type = 'USER' AND status = 'ACTIVE' AND taddr IS NOT NULL THEN 1 ELSE 0 END) user_active_txn, SUM(CASE WHEN type = 'USER' AND status = 'INACTIVE' AND taddr IS NOT NULL THEN 1 ELSE 0 END) user_inactive_txn, SUM(CASE WHEN type = 'USER' AND status = 'ACTIVE' AND state = 'WAITING' AND wait_class = 'Scheduler' THEN 1 ELSE 0 END) user_scheduler, SUM(CASE WHEN type = 'USER' AND status = 'ACTIVE' AND state = 'WAITING' AND wait_class = 'User I/O' THEN 1 ELSE 0 END) user_io, SUM(CASE WHEN type = 'USER' AND status = 'ACTIVE' AND state = 'WAITING' AND wait_class = 'Application' THEN 1 ELSE 0 END) user_application, SUM(CASE WHEN type = 'USER' AND status = 'ACTIVE' AND state = 'WAITING' AND wait_class = 'Concurrency' THEN 1 ELSE 0 END) user_concurency, SUM(CASE WHEN type = 'USER' AND status = 'ACTIVE' AND state = 'WAITING' AND wait_class = 'Commit' THEN 1 ELSE 0 END) user_commit, MIN(last_call_et) last_call_secs, ROUND(AVG(last_call_et)) avg_last_call_secs FROM all_sessions GROUP BY con_id ) SELECT CASE WHEN c.name IS NULL THEN 'CDB' ELSE c.name END||'('||s.con_id||')' pdb, s.total_sessions, s.type_user, s.type_background, --s.type_recursive, s.status_active, s.status_inactive, s.user_active, s.user_inactive, s.user_active_cpu, s.user_active_waiting, s.user_active_txn, s.user_inactive_txn, s.user_scheduler, s.user_io, s.user_application, s.user_concurency, s.user_commit, s.last_call_secs, s.avg_last_call_secs FROM sessions s, v$containers c WHERE c.con_id(+) = s.con_id AND c.open_mode(+) = 'READ WRITE' ORDER BY CASE WHEN c.name IS NULL THEN 'CDB' ELSE c.name END / PRO PRO SQL> @&&cs_script_name..sql -- @@cs_internal/cs_spool_tail.sql @@cs_internal/cs_undef.sql @@cs_internal/cs_reset.sql --