Verifica coleta de estatísticas das Tabelas e Índices – Oracle

Neste post irei mostrar um script que verifica a data da última coleta de estatísticas dos índices e tabelas no Oracle.

Antes de mostrar o script, irei deixar alguns links de conteúdo caso você ainda tenha alguma duvida, ou também não compreenda muito bem como funciona a coleta de estatísticas no Oracle, ou como fazer uma coleta de estatísticas, etc. São eles:

Gerenciando Estatísticas do Otimizador;
Coletando estatísticas para o otimizador de queries do Oracle;
Entendendo o Otimizador de Coleta de Estatísticas (conteúdo excelente!);
ALL_IND_STATISTICS.

Ambos scripts retornam os seguintes campos:
Schema: a qual schema (dono) o objeto faz parte;
Objeto: o nome do objeto;
Tipo do Objeto: qual é o tipo do objeto, neste caso: tabela ou índice;
Qtd. de Linhas: retorna o número de registros que o objeto possui;
Ultima Coleta: mostra a data e hora que fora realizada a última analise (coleta) no objeto.

Verifica a coleta de estatísticas das tabelas

SELECT
   S.Owner As "Schema"
  ,S.Table_Name As "Objeto"
  ,S.Object_Type As "Tipo do Objeto"
  ,S.Num_Rows As "Qtd. de Linhas"
  ,To_Char(S.Last_Analyzed, 'yyyy-MM-dd HH24:mm:ss') As "Ultima Coleta"
FROM
  sys.dba_tab_statistics S
WHERE
  S.Owner Not In('SYS', 'SYSTEM', 'SYSMAN', 'DBSNMP')
ORDER BY
  S.Last_Analyzed;

Verifica a coleta de estatísticas dos índices

SELECT
   S.Owner As "Schema"
  ,S.Table_Name As "Objeto"
  ,S.Object_Type As "Tipo do Objeto"
  ,S.Num_Rows As "Qtd. de Linhas"
  ,To_Char(S.Last_Analyzed, 'yyyy-MM-dd HH24:mm:ss') As "Ultima Coleta"
FROM
  sys.dba_ind_statistics S
WHERE
  S.Owner Not In('SYS', 'SYSTEM', 'SYSMAN', 'DBSNMP')
ORDER BY
  S.Last_Analyzed;
Anúncios

Tamanho do Banco de Dados em MB – Oracle

Neste artigo irei mostrar um script que mostra o tamanho da base de dados em uma instância do Oracle.

O script retorna os seguintes campos: Data, Undo, Redo, Temp, Livre e Total. Para entendimento de alguns campos retornados no script, segue alguns links para melhor entendimento do significado e a importância de cada um:

Arquivos de Data (Datafiles, tablespaces);
Undo;
Redo;
Temp.

Script:

SET FEED OFF

prompt
prompt TAMANHO DO BANCO DE DADOS EM MB
prompt ===============================

col dados for a10
col undo  for a12
col redo  for a12
col temp  for a12
col livre for a12
col total for a12

select to_char(sum(dados) / 1048576, 'fm99g999g990') dados,
       to_char(sum(undo) / 1048576, 'fm99g999g990') undo,
       to_char(sum(redo) / 1048576, 'fm99g999g990') redo,
       to_char(sum(temp) / 1048576, 'fm99g999g990') temp,
       to_char(sum(free) / 1048576, 'fm99g999g990') livre,
       to_char(sum(dados + undo + redo + temp) / 1048576, 'fm99g999g990') total
from (
  select sum(decode(substr(t.contents, 1, 1), 'P', bytes, 0)) dados,
         sum(decode(substr(t.contents, 1, 1), 'U', bytes, 0)) undo,
         0 redo,
         0 temp,
         0 free
  from dba_data_files f, dba_tablespaces t
  where f.tablespace_name = t.tablespace_name
  union all
  select 0 dados,
         0 undo,
         0 redo,
         sum(bytes) temp,
         0 free
  from dba_temp_files f, dba_tablespaces t
  where f.tablespace_name = t.tablespace_name(+)
  union all
  select 0 dados,
         0 undo,
         sum(bytes * members) redo,
         0 temp,
         0 free
  from v$log
  union all
  select 0 dados,
         0 undo,
         0 redo,
         0 temp,
         sum(bytes) free
  from dba_free_space f, dba_tablespaces t
  where f.tablespace_name = t.tablespace_name and
        substr(t.contents, 1, 1) = 'P'
);

prompt

SET FEED ON

Archives gerados por hora/dia – Oracle

Neste artigo mostrarei um script que mostra a quantidade dearchives gerados por hora pelo RMAN.

Este script foi criado pelo Jeffrey M. Hunter. Este script ‘analisa’ a view v$log_history.

Este script pode servir como um troubleshooting simples, por exemplo: às 13hrs sempre são gerados, em média, cerca de 5 de archives, porém alguns dias depois você percebe que foram gerados 10 archives no mesmo horário, ou seja, pode ser indício que algum processo pesado foi executado. É importante lembrar que isto são apenas indícios e que uma análise mais detalhada deverá ser realizada.

SET LINESIZE 145
SET PAGESIZE 9999
SET VERIFY   off

COLUMN H00   FORMAT 999     HEADING '00'
COLUMN H01   FORMAT 999     HEADING '01'
COLUMN H02   FORMAT 999     HEADING '02'
COLUMN H03   FORMAT 999     HEADING '03'
COLUMN H04   FORMAT 999     HEADING '04'
COLUMN H05   FORMAT 999     HEADING '05'
COLUMN H06   FORMAT 999     HEADING '06'
COLUMN H07   FORMAT 999     HEADING '07'
COLUMN H08   FORMAT 999     HEADING '08'
COLUMN H09   FORMAT 999     HEADING '09'
COLUMN H10   FORMAT 999     HEADING '10'
COLUMN H11   FORMAT 999     HEADING '11'
COLUMN H12   FORMAT 999     HEADING '12'
COLUMN H13   FORMAT 999     HEADING '13'
COLUMN H14   FORMAT 999     HEADING '14'
COLUMN H15   FORMAT 999     HEADING '15'
COLUMN H16   FORMAT 999     HEADING '16'
COLUMN H17   FORMAT 999     HEADING '17'
COLUMN H18   FORMAT 999     HEADING '18'
COLUMN H19   FORMAT 999     HEADING '19'
COLUMN H20   FORMAT 999     HEADING '20'
COLUMN H21   FORMAT 999     HEADING '21'
COLUMN H22   FORMAT 999     HEADING '22'
COLUMN H23   FORMAT 999     HEADING '23'
COLUMN TOTAL FORMAT 999,999 HEADING 'Total'


SELECT
    SUBSTR(TO_CHAR(first_time, 'DD/MM/RRRR HH:MI:SS'),1,10)                       DAY
  , SUM(DECODE(SUBSTR(TO_CHAR(first_time, 'DD/MM/RR HH24:MI:SS'),10,2),'00',1,0)) H00
  , SUM(DECODE(SUBSTR(TO_CHAR(first_time, 'DD/MM/RR HH24:MI:SS'),10,2),'01',1,0)) H01
  , SUM(DECODE(SUBSTR(TO_CHAR(first_time, 'DD/MM/RR HH24:MI:SS'),10,2),'02',1,0)) H02
  , SUM(DECODE(SUBSTR(TO_CHAR(first_time, 'DD/MM/RR HH24:MI:SS'),10,2),'03',1,0)) H03
  , SUM(DECODE(SUBSTR(TO_CHAR(first_time, 'DD/MM/RR HH24:MI:SS'),10,2),'04',1,0)) H04
  , SUM(DECODE(SUBSTR(TO_CHAR(first_time, 'DD/MM/RR HH24:MI:SS'),10,2),'05',1,0)) H05
  , SUM(DECODE(SUBSTR(TO_CHAR(first_time, 'DD/MM/RR HH24:MI:SS'),10,2),'06',1,0)) H06
  , SUM(DECODE(SUBSTR(TO_CHAR(first_time, 'DD/MM/RR HH24:MI:SS'),10,2),'07',1,0)) H07
  , SUM(DECODE(SUBSTR(TO_CHAR(first_time, 'DD/MM/RR HH24:MI:SS'),10,2),'08',1,0)) H08
  , SUM(DECODE(SUBSTR(TO_CHAR(first_time, 'DD/MM/RR HH24:MI:SS'),10,2),'09',1,0)) H09
  , SUM(DECODE(SUBSTR(TO_CHAR(first_time, 'DD/MM/RR HH24:MI:SS'),10,2),'10',1,0)) H10
  , SUM(DECODE(SUBSTR(TO_CHAR(first_time, 'DD/MM/RR HH24:MI:SS'),10,2),'11',1,0)) H11
  , SUM(DECODE(SUBSTR(TO_CHAR(first_time, 'DD/MM/RR HH24:MI:SS'),10,2),'12',1,0)) H12
  , SUM(DECODE(SUBSTR(TO_CHAR(first_time, 'DD/MM/RR HH24:MI:SS'),10,2),'13',1,0)) H13
  , SUM(DECODE(SUBSTR(TO_CHAR(first_time, 'DD/MM/RR HH24:MI:SS'),10,2),'14',1,0)) H14
  , SUM(DECODE(SUBSTR(TO_CHAR(first_time, 'DD/MM/RR HH24:MI:SS'),10,2),'15',1,0)) H15
  , SUM(DECODE(SUBSTR(TO_CHAR(first_time, 'DD/MM/RR HH24:MI:SS'),10,2),'16',1,0)) H16
  , SUM(DECODE(SUBSTR(TO_CHAR(first_time, 'DD/MM/RR HH24:MI:SS'),10,2),'17',1,0)) H17
  , SUM(DECODE(SUBSTR(TO_CHAR(first_time, 'DD/MM/RR HH24:MI:SS'),10,2),'18',1,0)) H18
  , SUM(DECODE(SUBSTR(TO_CHAR(first_time, 'DD/MM/RR HH24:MI:SS'),10,2),'19',1,0)) H19
  , SUM(DECODE(SUBSTR(TO_CHAR(first_time, 'DD/MM/RR HH24:MI:SS'),10,2),'20',1,0)) H20
  , SUM(DECODE(SUBSTR(TO_CHAR(first_time, 'DD/MM/RR HH24:MI:SS'),10,2),'21',1,0)) H21
  , SUM(DECODE(SUBSTR(TO_CHAR(first_time, 'DD/MM/RR HH24:MI:SS'),10,2),'22',1,0)) H22
  , SUM(DECODE(SUBSTR(TO_CHAR(first_time, 'DD/MM/RR HH24:MI:SS'),10,2),'23',1,0)) H23
  , COUNT(*)                                                                      TOTAL
FROM
  v$log_history  a
GROUP BY 
	SUBSTR(TO_CHAR(first_time, 'DD/MM/RRRR HH:MI:SS'),1,10)
ORDER BY 1

Scripts Grant – Oracle

Neste artigo irei mostrar 5 scripts para dar os grants de SELECT, UPDATE, INSERT, DELETE e EXECUTE para qualquer usuário no Oracle respectivamente.

O script cria um arquivo.sql através do comando spool, e neste script é realizado um SELECT para listar os objetos. Estes objetos retornados no SELECT é são concatenados com o comando GRANT. Logo após, o script irá rodar o arquivo.sql criado com os comandos para dar os GRANTS.

Grant para DELETE:

SET PAGESIZE 0
SET FEEDBACK OFF
SET VERIFY OFF

Spool Temp_Delete.sql

SELECT 'GRANT DELETE ON "' || U.Table_Name || '" TO nome_do_usuario;'
FROM   User_Tables U
WHERE  Not Exists (SELECT '1'
                   FROM   All_Tab_Privs A
                   WHERE  A.Grantee    = UPPER('&1')
                   AND    A.Privilege  = 'DELETE'
                   AND    A.Table_Name = U.Table_Name);

Spool Off

-- Linha comentada para evitar de executar imediatamente
@Temp_Delete.sql

SET PAGESIZE 14
SET FEEDBACK ON
SET VERIFY ON

Grant para SELECT:

SET PAGESIZE 0
SET FEEDBACK OFF
SET VERIFY OFF

Spool Temp_Select.sql

SELECT 'GRANT SELECT ON "' || u.object_name || '" TO nome_do_usuario;'
FROM   User_Objects U
WHERE  U.Object_Type In ('TABLE','VIEW','SEQUENCE')
AND    Not Exists (SELECT '1'
                   FROM   All_Tab_Privs A
                   WHERE  A.Grantee    = UPPER('&1')
                   AND    A.Privilege  = 'SELECT'
                   AND    A.Table_Name = U.Object_Name);

Spool Off

-- Linha comentada para evitar de executar imediatamente
@Temp_Select.sql

SET PAGESIZE 14
SET FEEDBACK ON
SET VERIFY ON

Grant para EXECUTE:

SET PAGESIZE 0
SET FEEDBACK OFF
SET VERIFY OFF

Spool Temp_Execute.sql

SELECT 'GRANT EXECUTE ON "' || U.Object_Name || '" TO nome_do_usuario;'
FROM   USer_Objects U
WHERE  U.Object_Type In ('PACKAGE','PROCEDURE','FUNCTION')
AND    Not Exists (SELECT '1'
                   FROM   All_Tab_Privs A
                   WHERE  A.Grantee    = UPPER('&1')
                   AND    A.Privilege  = 'EXECUTE'
                   AND    A.Table_Name = U.Object_Name);

Spool Off

-- Linha comentada para evitar de executar imediatamente
@Temp_Execute.sql

SET PAGESIZE 14
SET FEEDBACK ON
SET VERIFY ON

Grant para UPDATE:

SET PAGESIZE 0
SET FEEDBACK OFF
SET VERIFY OFF

Spool Temp_Update.sql

SELECT 'GRANT UPDATE ON "' || U.Table_Name || '" TO nome_do_usario;'
FROM   User_Tables U
WHERE  NOT EXISTS (SELECT '1'
                   FROM   All_Tab_Privs A
                   WHERE  A.Grantee    = UPPER('&1')
                   AND    A.Privilege  = 'UPDATE'
                   AND    A.Table_Name = U.Table_Name);

Spool Off

-- Linha comentada para evitar de executar imediatamente
@Temp_Update.sql

SET PAGESIZE 14
SET FEEDBACK ON
SET VERIFY ON

Grant para INSERT:

SET PAGESIZE 0
SET FEEDBACK OFF
SET VERIFY OFF

Spool Temp_Insert.sql

SELECT 'GRANT INSERT ON "' || u.table_name || '" TO nome_do_usuario;'
FROM   User_Tables U
WHERE  NOT EXISTS (SELECT '1'
                   FROM   All_Tab_Privs A
                   WHERE  A.Grantee    = UPPER('&1')
                   AND    A.Privilege  = 'INSERT'
                   AND    A.Table_Name = U.Table_Name);

Spool Off

-- Linha comentada para evitar de executar imediatamente
@Temp_Insert.sql

SET PAGESIZE 14
SET FEEDBACK ON
SET VERIFY ON

Sessões em Espera – Oracle

Neste artigo irei mostrar um simples script responsável por listar todas as sessões que estão com o ‘status’ de espera, ou seja, ainda estão na fila para poder conectar-se no banco.

O Oracle fornece várias views para facilitar a monitoração, neste post iremos utilizar duas views importantes chamado: v$session_wait e v$system_event. Estas views nos fornecem informações detalhadas sobre o estado de espera das sessões. É sempre importante verificar se há muitas sessões em espera, pois isso pode causar algum gargalo no sistema ou afetar alguns objetos individualmente.

Este script retorna os seguintes campos:

UserName: nome do usuário no Oracle;
SID: o id da sessão;
Serial#: o serial number da sessão, na qual é utilizado apenas para identificar a sessão dos objetos utilizados;
Event: o evento para a qual sessão está em espera;
Wait_Class: nome da classe para o evento em espera;
Wait_Time: se a sessão está atualmente aguardando, então o valor é 0. Se a sessão não está em uma espera e, em seguida, o valor é o seguinte: > 0-valor é a duração da última aguardar em centésimos de segundo -1 – duração da última espera foi menos de um centésimo de um segundo–2 – TIMED_STATISTICS parâmetro foi definido como false;
Seconds_In_Wait: mostra em segundos o tempo que a sessão está como espera;
State: o status da sessão.

Script:

SET LINESIZE 200
SET PAGESIZE 1000

COLUMN UserName FORMAT A20
COLUMN Event FORMAT A30
COLUMN Wait_Class FORMAT A15

SELECT 
	  NVL(s.UserName, '(oracle)') As UserName
	, s.SID
	, s.Serial#
	, sw.Event
	, sw.Wait_class
	, sw.Wait_Time
	, sw.Seconds_In_Wait
	, sw.State
FROM   
	v$session_wait sw, v$session s
WHERE  
	s.SID = sw.SID
ORDER BY 
	sw.Seconds_In_Wait DESC;

Scripts Monitoração – Oracle

Neste artigo irei mostrar um script que encontrei no dba-oracle. Este script retorna informações uteis para um check no banco de dados.

Este script utilizará o spool (link documentação Oracle) para salvar em um arquivo txt os resultados.

Os checks feitos pelo script:

Uptime: tempo em que a instância está aberta;
Object Status: mostra o status dos objetos;
Invalid Objects: mostra os objetos que estão com o status inválido (entenda mais sobre invalid object);
Recover Files: mostra os arquivos que foram utilizados no Recover do Oracle;
Partitioned Table: mostra as tabelas particionadas na base de dados;
Free space in Tablespace: mostra o espaço livre das tablespaces;
Max Extents Status: mostra o status das Max Extents;
Any partitioned Object approaching to max extents: mostra quais objetos particionados estão próximos de chegar ao limite do seu Max Extens;
Block Contention: mostra quais os blocks contetion que estão ocorrendo na base de dados;
Latch Contention: mostra quias os latch contetion que estão ocorrendo na base de dados;
Top 10 Queries using more disk reads: mostra as 10 queries que estão consumindo mais disco neste momento;
Top 10 Queries using more buffer reads: mostra as 10 queries que estão consumindo mais buffer neste momento;
Buffer cache hit ratio: mostra o volume de buffers consumidos pela CPU no Oracle;
Reloads/Pins in v$librarycache: mostra o volume de Reloads/Pings na view LibraryCache;
Get miss ratio from v$rowcache: mostra mais algumas informações sobre Ratio (mesmo link no tópico anterior);
Redo log space request ratio in v$sysstat: mostra o espaço requerido pelo ratio dos redo logs;
RBS Contention: mostra o RBS Contention na base de dados;
Sorts stats: mostra os sorts stats na base de dados;
Datafiles I/O: mostra os arquivos (datafiles) das tablespaces.

Script:

set linesize 132 
set pagesize 1000
 
spool report.txt
 
prompt #### Up Time ####
 
 
select 'Hostname      : ' || host_name
      ,'Instance Name : ' || instance_name
      ,'Started At    : ' || to_char(startup_time,'DD-MON-YYYY HH24:MI:SS') stime
      ,'Uptime        : ' || floor(sysdate - startup_time) || ' days(s) ' ||
       trunc( 24*((sysdate-startup_time) - 
       trunc(sysdate-startup_time))) || ' hour(s) ' ||
       mod(trunc(1440*((sysdate-startup_time) - 
       trunc(sysdate-startup_time))), 60) ||' minute(s) ' ||
       mod(trunc(86400*((sysdate-startup_time) - 
       trunc(sysdate-startup_time))), 60) ||' seconds' uptime
from sys.v_$instance;
prompt 
prompt 
prompt ################################################################################
 
 
 
prompt .>>>>>>    Object status 
 
select object_type,status,count(*) cnt from user_objects  group by  object_type,status;
prompt 
prompt 
prompt ################################################################################
 
 
 
prompt .>>>>>>  Invalid objects 
 
 
select owner, object_type, substr(object_name,1,30) object_name
from sys.dba_objects
where status='INVALID'
order by object_type;
 
prompt 
prompt 
prompt ################################################################################
 
 
prompt .>>>>>>    Recover files
 
select * from sys.v_$recover_file;
prompt 
prompt 
prompt ################################################################################
 
prompt .>>>>>> partitioned table
 
select table_name from user_tables where partitioned='YES';
prompt 
prompt 
prompt ################################################################################
 
 
prompt .>>>>>> Free space in Tablespace 
 
 
Select tablespace_name,sum(bytes/1024/1024) from sys.dba_free_space group by tablespace_name;
prompt 
prompt 
prompt ################################################################################
 
 
prompt .>>>>>>Max Extents Status
 
select segment_name, segment_type, extents, max_extents from sys.dba_segments where max_extents-extents<100;
prompt 
prompt 
prompt ################################################################################
 
 
prompt .>>>>>>  Any partitioned Object approaching to max extents
 
 
 
SELECT PARTITION_NAME,EXTENTS,MAX_EXTENTS,NEXT_EXTENT,max_extents-nvl(next_extent,0) FROM sys.dba_segments 
where max_extents-nvl(next_extent,0) < 1000
and partition_name is not null;
prompt 
prompt 
prompt ################################################################################
 
prompt .>>>>>>  Block Contention
 
SELECT class,sum(count) total_waits, sum(time) total_time FROM v$waitstat GROUP BY class;
 
prompt 
prompt 
prompt ################################################################################
 
 
prompt .>>>>>> Latch Contention
 
 
SELECT a.name,100.*b.sleeps/b.gets ratio1,100.*b.immediate_misses/decode((b.immediate_misses+b.immediate_gets),0,1) ratio2 
FROM v$latchname a, v$latch b WHERE
a.latch# = b.latch# AND b.sleeps > 0;
 
prompt 
prompt 
prompt ################################################################################
 
 
prompt .>>>>>> Top 10 Queries using more disk reads
 
    select disk_reads, sql_text from  
(    select disk_reads, sql_text from v$sqlarea
     where disk_reads > 10000 order by disk_reads desc) 
where    rownum < 11; 
 
prompt 
prompt 
prompt ################################################################################
 
 
prompt .>>>>>> Top 10 Queries using more buffer reads
 
 
select  buffer_gets,sql_text from v$sqlarea where buffer_gets>10000 and rownum < 11 order by buffer_gets desc;
 
 
prompt 
prompt 
prompt ################################################################################
 
 
prompt .>>>>>> Buffer cache hit ratio 
 
select (1- (sum(decode(a.name,'physical reads',value,0)))/
        (sum(decode(a.name,'db block gets',value,0)) +
        sum(decode(a.name,'consistent gets',value,0)))) * 100 pct
        from v$sysstat a;
 
prompt 
prompt 
prompt ################################################################################
 
 
prompt .>>>>>> Reloads/Pins in v$librarycache 
 
select sum(pins) "executions",sum(reloads) "cache Misses",sum(reloads)/sum(pins)*100 "Ratio" from v$librarycache;
 
prompt 
prompt 
prompt ################################################################################
 
 
prompt .>>>>>> Get miss ratio from v$rowcache  
 
select (sum(getmisses)/sum(gets)) * 100 "Hit Ratio" from v$rowcache;
 
 
prompt 
prompt 
prompt ################################################################################
 
 
prompt .>>>>>> Redo log space request ratio in v$systat 
 
select (req.value*5000)/entries.value "ratio" 
from v$sysstat req,v$sysstat entries 
where req.name='redo log space requests' and entries.name='redo entries' ;
 
prompt 
prompt 
prompt ################################################################################
 
 
prompt .>>>>>> RBS Contention
 
 
select sum(waits)/sum(gets)*100 from v$rollstat; 
 
prompt 
prompt 
prompt ################################################################################
 
 
prompt .>>>>>> sorts stats
 
 
Select * from v$sysstat where name like '%sorts%';
 
prompt 
prompt 
prompt ################################################################################
 
 
prompt .>>>>>> datafiles I/O
 
 
select name, phyrds, phywrts from v$datafile df, v$filestat fs where df.file# = fs.file# order by phyrds;  
 
prompt 
prompt 
prompt 
prompt 
 
spool off

Qualquer duvida referente às views que estão no script, você pode acessar este link. Neste link você pode procurar a view, que ele irá mostrar todas as descrições dos campos retornados.

Script para obter estatísticas da sessão – Oracle

Neste artigo mostrarei 2 scripts (uma na versão 10g e a outra na 11g) que irá mostrar algumas estatísticas das sessões ativas na base de dados.

Este artigo possuí algumas informações a mais do que em um outro artigo feito recentemente.

* Este script foi adaptado de alguns artigos que encontrei em fóruns recentemente.

Para a versão 10g do Oracle:

SELECT Logon_time,
         (SELECT ROUND (VALUE / 1024 / 1024, 2)
            FROM v$sesstat
           WHERE STATISTIC# = 25 AND v$sesstat.SID = v$session.sid)
            AS "PGA Memory, in MB",
         (SELECT VALUE
            FROM v$sesstat
           WHERE STATISTIC# = 12 AND v$sesstat.SID = v$session.sid)
            AS "CPU, used by session",
         ROUND ( (SELECT VALUE
                    FROM v$sesstat
                   WHERE STATISTIC# = 339 AND v$sesstat.SID = v$session.sid)
                / (SELECT DECODE (VALUE, 0, 1, VALUE)
                     FROM v$sesstat
                    WHERE STATISTIC# = 338 AND v$sesstat.SID = v$session.sid),
                2)
            AS "Hard Parse, %",
         (SELECT ROUND (VALUE / 1024 / 1024, 2)
            FROM v$sesstat
           WHERE STATISTIC# = 58 AND v$sesstat.SID = v$session.sid)
            AS "Physical read bytes, in MB",
         (SELECT ROUND (VALUE / 1024 / 1024, 2)
            FROM v$sesstat
           WHERE STATISTIC# = 66 AND v$sesstat.SID = v$session.sid)
            AS "Physical write bytes, in MB",
         (SELECT ROUND (VALUE / 1024 / 1024, 2)
            FROM v$sesstat
           WHERE STATISTIC# = 139 AND v$sesstat.SID = v$session.sid)
            AS "Redo size, in MB",
         (SELECT ROUND (VALUE / 1024 / 1024, 2)
            FROM v$sesstat
           WHERE STATISTIC# = 344 AND v$sesstat.SID = v$session.sid)
            AS "Received from client, in MB",
         (SELECT ROUND (VALUE / 1024 / 1024, 2)
            FROM v$sesstat
           WHERE STATISTIC# = 343 AND v$sesstat.SID = v$session.sid)
            AS "Sent to client, in MB",
         SID,
         SERIAL#,
         v$session.STATUS,
         PROGRAM,
         USER#,
         USERNAME,
         COMMAND,
         OWNERID,
         OSUSER,
         PROCESS,
         MACHINE,
         OBJECT_NAME
    FROM    v$session
         LEFT OUTER JOIN
            DBA_OBJECTS
         ON v$session.ROW_WAIT_OBJ# = dba_objects.object_ID
   WHERE v$session.LOGON_TIME BETWEEN TRUNC (SYSDATE) AND SYSDATE
         --AND v$session.STATUS = 'ACTIVE'
ORDER BY 5 DESC;

E para a versão 11g do Oracle:

SELECT Logon_time,
       (SELECT ROUND (VALUE / 1024 / 1024, 2)
          FROM v$sesstat
         WHERE STATISTIC# = 35 AND v$sesstat.SID = v$session.sid)
          AS "PGA Memory, in MB",
       (SELECT VALUE
          FROM v$sesstat
         WHERE STATISTIC# = 17 AND v$sesstat.SID = v$session.sid)
          AS "CPU, used by session",
       ROUND ( (SELECT VALUE
                  FROM v$sesstat
                 WHERE STATISTIC# = 584 AND v$sesstat.SID = v$session.sid)
              / (SELECT DECODE (VALUE, 0, 1, VALUE)
                   FROM v$sesstat
                  WHERE STATISTIC# = 583 AND v$sesstat.SID = v$session.sid),
              2)
          AS "Hard Parse, %",
       (SELECT ROUND (VALUE / 1024 / 1024, 2)
          FROM v$sesstat
         WHERE STATISTIC# = 83 AND v$sesstat.SID = v$session.sid)
          AS "Physical read bytes, in MB",
       (SELECT ROUND (VALUE / 1024 / 1024, 2)
          FROM v$sesstat
         WHERE STATISTIC# = 96 AND v$sesstat.SID = v$session.sid)
          AS "Physical write bytes, in MB",
       (SELECT ROUND (VALUE / 1024 / 1024, 2)
          FROM v$sesstat
         WHERE STATISTIC# = 185 AND v$sesstat.SID = v$session.sid)
          AS "Redo size, in MB",
       (SELECT ROUND (VALUE / 1024 / 1024, 2)
          FROM v$sesstat
         WHERE STATISTIC# = 590 AND v$sesstat.SID = v$session.sid)
          AS "Received from client, in MB",
       (SELECT ROUND (VALUE / 1024 / 1024, 2)
          FROM v$sesstat
         WHERE STATISTIC# = 589 AND v$sesstat.SID = v$session.sid)
          AS "Sent to client, in MB",
       SID,
       SERIAL#,
       v$session.STATUS,
       PROGRAM,
       USER#,
       USERNAME,
       COMMAND,
       OWNERID,
       OSUSER,
       PROCESS,
       MACHINE,
       OBJECT_NAME
  FROM    v$session
       LEFT OUTER JOIN
          DBA_OBJECTS
       ON v$session.ROW_WAIT_OBJ# = dba_objects.object_ID
 WHERE v$session.LOGON_TIME BETWEEN TRUNC (SYSDATE) AND SYSDATE
       --AND v$session.STATUS = 'ACTIVE'
ORDER BY 5 DESC