Monday, May 23, 2005

Oracle - CPU used by a database user on per session basis

CPU used by a database user on per session basis on Oracle
DECLARE
v_session_cpu NUMBER;
v_system_cpu NUMBER;
v_cpu_ratio NUMBER;
v_sid NUMBER;
v_serial NUMBER;
v_osuser v$session.osuser%type;
v_username v$session.username%type;
my_exception EXCEPTION;
CURSOR sess IS
SELECT sid,serial#,username
FROM v$session
WHERE username is not null
ORDER BY username;

BEGIN
OPEN sess;
FETCH sess into v_sid,v_serial,v_username;
IF sess%notfound THEN
RAISE no_data_found;
END IF;

LOOP
SELECT value
INTO v_session_cpu
FROM v$sesstat
WHERE sid = v_sid
AND statistic# = 12;

SELECT value
INTO v_system_cpu
FROM v$sysstat
WHERE name = 'CPU used by this session';

v_cpu_ratio := ROUND((v_session_cpu/v_system_cpu)*100,2);

dbms_output.put_line('CPU used by user '||v_username||'('||
''''||v_sid||','||v_serial||''''||') => '||v_cpu_ratio||'%' );

FETCH sess into v_sid,v_serial,v_username;
IF sess%notfound THEN
RAISE my_exception;
END IF;
END LOOP;
CLOSE sess;
EXCEPTION
WHEN no_data_found THEN
dbms_output.put_line('No users connected');
close sess;
WHEN my_exception THEN
null;
CLOSE sess;
END;
/

No comments: