12c - Temporary Undo

As Global Temporary Tables foram introduzidas no Oracle 8i, com o objetivo de reduzir o overhead dos dados temporários dentro do banco de dados.

Uma Global Temporary Table armazena seus dados em uma temporary tablespace e estes dados são mantidos durante a transação ou durante toda a sessão (ON COMMIT DELETE ROWS ou ON COMMIT PRESERVE ROWS).

Instruções DML em Global Temporary Tables não geram REDO, devido ao fato destes dados estarem armazenados em uma temporary tablespace, mas geram UNDO e isto sim implicará na geração de REDO.

No Oracle Database 12c, existe um novo parâmetro chamado TEMP_UNDO_ENABLED que pode ser alterado a nível de banco de dados ou de sessão. Se este parâmetro for habilitado, o UNDO gerado por transações DML em objetos temporários (ex. global temporary tables) será guardado em uma temporary tablespace.

Este novo recurso, além de diminuir a geração de REDO, também permite o uso de instruções DML em global temporary tables em um  physical standby database com Active Data Guard option.

Não precisamos nos preocupar com os dados de REDO gravados em uma temporary tablespace, pois eles não são necessários para um recovery.


SQL> create global temporary table tabela_testes(coluna1 number, coluna2 char(100));
Table created.

SQL> set autotrace on statistics

SQL> insert into tabela_testes select level, level from dual connect by level <= 10000;

10000 rows created.


Statistics
----------------------------------------------------------
119 recursive calls
859 db block gets
320 consistent gets
2 physical reads
62344 redo size
856 bytes sent via SQL*Net to client
882 bytes received via SQL*Net from client
3 SQL*Net roundtrips to/from client
17 sorts (memory)
0 sorts (disk)
10000 rows processed




SQL> alter session set temp_undo_enabled=true;
Session altered.

SQL> set autotrace on statistics
SQL> insert into tabela_testes select level, level from dual connect by level <= 10000;

10000 rows created.


Statistics
----------------------------------------------------------
4 recursive calls
865 db block gets
154 consistent gets
1 physical reads
272 redo size
853 bytes sent via SQL*Net to client
881 bytes received via SQL*Net from client
3 SQL*Net roundtrips to/from client
2 sorts (memory)
0 sorts (disk)
10000 rows processed




Segue abaixo algumas V$ views que podemos consultar para obter informações e estatísticas a respeito de temporary undo data:

  • V$TEMPUNDOSTAT
  • DBA_HIST_UNDOSTAT
  • V$UNDOSTAT


Referências:




Abraço


Alex Zaballa

0 comentários: