Pular para o conteúdo

Tabelas Temporárias Globais no Oracle: Reduzindo o overhead dos dados temporários

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

Alex Zaballa

Alex Zaballa, formado em Análise de Sistemas, é especialista em Banco de Dados Oracle com sólidos conhecimentos em Servidores de Aplicação e Sistemas Operacionais; trabalha com Oracle há 15 anos, é ORACLE ACE Director, certificado OCM Database 11G / Cloud e conta com mais de 140 outras certificações em produtos da Oracle. Alex também é um dos fundadores do Grupo de Usuários Oracle de Angola (GUOA), participa do Grupo de Usuários de Tecnologia Oracle Brasil (GUOB) e é membro do time OraWorld.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

plugins premium WordPress