Como executar updates com o tablespace UNDO

Este artigo apresenta como podemos otimizar a execução de comandos SQL de forma a evitar estouro de espaço da memória e consequente finalização inesperada da transação em execução.

Fique por dentro
O banco Oracle fornece um mecanismo totalmente automatizado para o gerenciamento de undo que permite o armazenamento de informações necessárias para retornarmos o banco para um estado válido quando ocorre algum problema durante a atualização do banco. O artigo apresenta uma alternativa para o gerenciamento do tablespace UNDO de forma a evitar o estouro de espaço e consequente finalização inesperada da transação em execução. O entendimento deste tema é útil quando é necessário alterar um volume de dados muito alto e o tamanho do tablespace UNDO não comporta tal volume.

Para garantir a consistência dos dados em caso de um rollback (seja ele intencional ou por finalização inesperada da sessão, por exemplo), o banco de dados Oracle necessita de uma estrutura para armazenar a informação original que está sendo alterada. Esta estrutura é conhecida por UNDO, que é um local de armazenamento (tablespace) para este tipo de informação. Em situações onde o volume de dados alterados é muito elevado, o espaço disponível no tablespace UNDO pode não ser suficiente para completar a operação e, fatalmente, a transação será finalizada com erro (e um rollback será automaticamente executado).

Para evitar esta situação, é possível construir um bloco PL/SQL onde a transação será particionada no nível de linhas afetadas e efetivações podem ser executadas a cada “n” linhas afetadas, liberando assim espaço no tablespace UNDO. Desta forma, a transação que afeta volumes grandes de dados não será finalizada com erro e não haverá impactos para outras sessões que eventualmente estejam executando qualquer outra operação.

Neste contexto, é normal nos depararmos com situações onde uma implementação de nova funcionalidade da aplicação requer alterações em tabelas nos bancos de dados. Até aí, não há problema algum, afinal é assim que as coisas funcionam. No entanto, esta atividade começa a ficar mais desafiadora quando nos encontramos em uma situação onde uma nova coluna deverá ser criada na tabela e receber um determinado valor para todos os registros da tabela, incluindo os registros já existentes e não apenas os novos registros inseridos após a implementação.

Diferentes soluções podem ser dadas para resolver este problema. Apresentaremos neste artigo uma solução inicial que foi dada e, em seguida, como melhorá-la. É importante destacar que o cenário apresentado e as soluções são reais. Naturalmente, os dados apresentados foram mascarados."

[...] continue lendo...

Artigos relacionados