Truncando tabelas

Sempre que você precisar remover uma ou mais linhas de uma tabela, a instrução DELETE geralmente é sua melhor escolha. Mas DELETE pode não ser o ideal em todas as situações. Por exemplo, digamos que sua tabela esteja equipada com índices para acelerar a consulta e com acionadores para proteger a integridade lógica dos dados na tabela. Tudo isso é ótimo, mas se sua tabela também tiver um grande número de linhas, uma instrução DELETE invocará o processamento linha por linha para revisar e atualizar cada índice e acionar todos os gatilhos apropriados linha por linha. Não há nada de errado nisso, é claro; de fato, há tudo certo sobre isso. É isso que um banco de dados bem projetado pode precisar fazer, dependendo dos requisitos de negócios.

Mas em certas circunstâncias em que você simplesmente precisa remover todas as linhas da tabela, pode achar que todo esse processamento detalhado é desnecessário; pode ser necessário simplesmente remover todos os dados. Nesse cenário, você pode considerar a alternativa de eliminar a tabela e criá-la novamente. Mas se você fizer isso, também precisará recriar os índices e gatilhos da tabela. Dependendo do relacionamento da tabela com outras tabelas, o trabalho extra necessário para fazer isso acontecer pode aumentar consideravelmente. Em uma tentativa de ignorar algum processamento desnecessário de uma instrução DELETE, você pode estar inadvertidamente criando uma boa quantidade de retrabalhos desnecessários. No entanto, o DELETE pode afetar o desempenho em um grande banco de dados de produção. É aqui que entra TRUNCATE TABLE. A instrução TRUNCATE TABLE faz o seguinte:

  • Remove todas as linhas em uma dada tabela
  • Remove todos os dados nos índices associados
  • Não dispara gatilhos DML.

Evitando a abordagem DROP TABLE / CREATE TABLE, o uso de TRUNCATE TABLE faz o seguinte:

  • Deixa intacta a tabela e as estruturas de índice
  • Deixa todas as dependências intactas, como tabelas filho
  • Não utiliza o espaço para desfazer como DELETE faria
  • Executa um commit implícito
  • Requer o privilégio DROP_ANY_TABLE
  • Não pode ser desfeito com ROLLBACK
  • Não funciona com FLASHBACK_TABLE
  • É um comando DDL

O fato de TRUNCATE TABLE ser DDL é o motivo pelo qual TRUNCATE TABLE não aciona nenhum gatilho DML, como ON DELETE, que não se aplica. A seguir, é apresentado um exemplo de uma declaração que truncará a tabela VENDORS:

TRUNCATE TABLE vendors;

A palavra-chave TRUNCATE é seguida pela palavra requerida TABLE, seguida pelo nome da tabela. (A palavra-chave TABLE é necessária porque TRUNCATE também pode ser usado para truncar outro objeto chamado cluster, que não está no exame, portanto não estamos preocupados com isso aqui.) Esse uso de TRUNCATE TABLE removerá todos os dados da tabela VENDORS, bem como seus índices, e executa automaticamente um COMMIT no banco de dados.

Tabelas filho truncadas recursivamente

O Oracle 12c oferece um novo recurso com TRUNCATE TABLE, que é a opção para CASCADE o truncamento para tabelas filho dependentes:

TRUNCATE TABLE vendors CASCADE;

Anteriormente, vimos como um relacionamento de tabela pai-filho pode ser criado com uma restrição de chave estrangeira com a cláusula opcional ON DELETE, que instrui o banco de dados a executar uma ação específica em uma linha filho se e quando uma linha pai for removida da tabela pai . O CASCADE da instrução TRUNCATE TABLE funciona de maneira semelhante.

Quando há vínculo entre tabelas, tabela pai com tabela filho e na tabela filho tiver uma chave estrangeira com a palavra chave ON DELETE CASCADE / SET NULL, então ao executar um delete na tabela pai exemplo: DELETE FROM PAI, a coluna da tabela filha terá os dados apagados se a cláusula for ON DELETE CASCADE ou será anulado / apagado se a cláusula for ON DELETE SET NULL.

Da mesma forma se executar o TRUNCATE em uma tabela com com vínculo de chave estrangeira irá dar erro, mas se informar a palavra chave CASCADE irá conseguir remover as linhas. O comando é: TRUNCATE TABLE nome_da_tabela CASCADE;

Sem CASCADE, o banco de dados Oracle não concluirá a instrução TRUNCATE TABLE, pois a cláusula ON DELETE CASCADE em uma tabela filha separada forçaria a remoção de linhas de dados adicionais além da tabela pai. A instrução TRUNCATE TABLE… CASCADE diz ao banco de dados Oracle para avançar com a remoção dessas linhas de qualquer maneira.

Observe que não precisamos dessa cláusula adicional com DELETE. A presença de ON DELETE CASCADE faz com que as linhas adicionais sejam removidas sem nenhuma direção adicional da instrução DELETE. Mas a instrução TRUNCATE TABLE tem o requisito adicional para a cláusula CASCADE. Lembre-se, isso se aplica apenas a situações em que uma tabela filha possui a cláusula ON DELETE CASCADE de sua restrição de chave estrangeira.

Referência

OCA Oracle Database SQL Exam Guide. Páginas: 164 – 167.

Deixe um comentário