Pular para o conteúdo principal

Postagens

Mostrando postagens de setembro, 2009

Quando e quem está utilizando segmentos temporários

8i e 9i: SELECT a.username, a.sid, a.serial#, a.osuser, b.tablespace, b.blocks, c.sql_text FROM v$session a, v$sort_usage b, v$sqlarea c WHERE a.saddr = b.session_addr AND c.address= a.sql_address AND c.hash_value = a.sql_hash_value ORDER BY b.tablespace, b.blocks; 10g: SELECT a.username, a.sid, a.serial#, a.osuser, b.tablespace, b.blocks, c.sql_text FROM v$session a, v$tempseg_usage b, v$sqlarea c WHERE a.saddr = b.session_addr AND c.address= a.sql_address AND c.hash_value = a.sql_hash_value ORDER BY b.tablespace, b.blocks;

Gerando o DDL de todos os índices do Schema

Conectar com o schema desejado: SET LONG 2000000 SET PAGESIZE 0 EXECUTE DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'STORAGE',false); SELECT DBMS_METADATA.GET_DDL('INDEX',u.index_name) FROM USER_INDEXES u ; EXECUTE DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'DEFAULT');

Monitorando TEMP space

Query monitorar utilizaçao/tamanho área temporária: select sum(u.blocks * blk.block_size) / 1024 / 1024 "TAMANHO UTILIZADO", (hwm.max * blk.block_size) / 1024 / 1024 "TAMANHO TOTAL" from v$sort_usage u, (select block_size from dba_tablespaces where contents = 'TEMPORARY') blk, (select segblk# + blocks max from v$sort_usage where segblk# = (select max(segblk#) from v$sort_usage)) hwm group by hwm.max * blk.block_size / 1024 / 1024;

Monitoring

Acredito que muitas vezes, você deve olhar aquela quantidade enorme de índices da sua base de dados e eis que surge a dúvida, será que todos estão sendo utilizados? Para tal você pode utilizar a feature MONITORING: exemplo: alter index idx_t1 monitoring usage; -- A query abaixo gera o scritp para ativar o monitoring de todos os índices de um determinado schema. select 'alter index '||owner||'.'||index_name||' monitoring usage;' from dba_indexes where owner = &owner; Você pode consultar o status utilizando a view v$object_usage , porem a mesma só retorna o status dos indices monitorados do schema corrente (conectado), portanto eu simplesmente pego o select da view e removo o join que filtra pelo schema. select du.username, io.name index_name, t.name table_name, decode(bitand(i.flags, 65536), 0, 'NO', 'YES') monitoring, decode(bitand(ou.flags, 1), 0, 'NO', 'YES') used, ou.start_monitoring start_monit

Coletando I/O estatísticas por tabela?

Sabemos que utilizando o STATSPACK ou o relatório UTLSTAT podemos gerar estatistias de I/O por tablespace. Porém podemos faze-lo tambem para as tabelas. $ORACLE_HOME/rdbms/admin sqlplus '/ as sysdba' @catio.sql exit; O script catio.sql , criará a procedure sample_io e a tabela ( SELECT * FROM io_per_object;) para coletar as estatísticas de I/O para as tabelas. Você pode consultar o cabeçalho do script para obter mais informações.

Verificando PGA Utilizada

set lines 110 col unm format a30 hea "USERNAME (SID,SERIAL#)" col pus format 999,990.9 hea "PROC KB|USED" col pal format 999,990.9 hea "PROC KB|MAX ALLOC" col pgu format 99,999,990.9 hea "PGA KB|USED" col pga format 99,999,990.9 hea "PGA KB|ALLOC" col pgm format 99,999,990.9 hea "PGA KB|MAX MEM" select s.username||' ('||s.sid||','||s.serial#||')' unm, round((sum(m.used)/1024),1) pus, round((sum(m.max_allocated)/1024),1) pal, round((sum(p.pga_used_mem)/1024),1) pgu, round((sum(p.pga_alloc_mem)/1024),1) pga, round((sum(p.pga_max_mem)/1024),1) pgm from v$process_memory m, v$session s, v$process p where m.serial# = p.serial# and p.pid = m.pid and p.addr=s.paddr and s.username is not null group by s.username, s.sid, s.serial# order by unm;