Friday, November 28, 2008

Undo e Transações.

Eu me peguei em situações onde fui questionado sobre a performance de transações, e um ponto critico era saber se a transação em questão estava ou não em execução, de uma forma ou de outra sabia que estava, pois a sessão se encontrava ativa, porém ainda não é o suficiente.
Há uma views no dicionário do Oracle, chamada v$transaction, a qual é interesante observarmos, em especial duas colunas, USED_UREC e USED_UBLK, onde a primeira coluna nos mostra a quantidade de registro na undo para aquela transação e a used_ublk, que nos mostra a quantiadade de blocos, podemos então fazer um join na v$session onde nos mostrará com maior detalhes o que está acontecendo no nosso banco.
Se a coluna used_urec e used_ublk estiver incrementando então a transação está indo pra frente, caso o contrário estará realizando rollback.

Temos a seguinte query para tal:

col sql_text format a40
set lines 130
select sq.sql_text sql_text, t.USED_UREC Records, t.USED_UBLK Blocks, (t.USED_UBLK*8192/1024/1024) MBytes from v$transaction t,
v$session s,
v$sql sq
where t.addr = s.taddr
and s.sql_id = sq.sql_id
and s.username = '&username'
/

E está nos mostra o instrução para cada sessão ativa:

select distinct s.sid, OSUSER,SUBSTR(s.USERNAME,1,10) USU,q.EXECUTIONS,Q.DISK_READS, q.SQL_TEXT
from v$sql q, v$session s
where s.SQL_ADDRESS=q.ADDRESS and s.status='ACTIVE' and s.username is not null;

Fontes:
http://oraclezone.wordpress.com/2007/12/08/how-much-undo-does-a-sql-use/
http://www.idevelopment.info/data/Oracle/DBA_tips/Database_Administration/DBA_30.shtml
http://youngcow.net/doc/oracle10g/server.102/b14237/dynviews_2170.htm
http://oracledisect.blogspot.com/2008/05/who-is-using-your-undo-space.html

Obrigado.

No comments: