GPO ( Grupo de Profissionais Oracle )
A maior comunidade Oracle do Brasil !

Diferenças entre TRUNCATE e DELETE

DML e DDL

Diferentemente do DELETE que é um DML (Data Manipulation Language) o TRUNCATE é um DDL (Data Definition Language), ou seja, o Truncate opera no dicionário de dados afetando diretamente a estrutura da tabela e não o conteúdo com o Delete faz. Apesar de terem um efeito parecido, que é “apagar” todo o conteúdo, ou linhas, da tabela.

Então, de que maneira eles fazem o “mesmo” serviço de forma diferente? Primeiramente antes de tudo, devemos especificar aqui que estamos comparando o Truncate com o Delete sem a cláusula Where, ocasionando na completa remoção de todas as linhas da tabela.

High Water Mark

Feito isso, devemos nos lembrar que no momento de criação de uma nova tabela o Oracle aloca uma área de espaço no disco de espaço fixo que de inicio então se encontra vazio e não formatado. E que Oracle consegue administrar esse espaço com a ajuda do High Water Mark (HWM), que é o ponto desse segmento em que todo o espaço depois dessa marca nunca foi utilizado e também se encontra como não formatado. Podemos ver uma representação do que foi dito até agora com a imagem abaixo, representando o espaço alocado pelo Oracle no momento de criação da tabela, podemos ver que o HWM se encontra no início pois nenhuma linha ainda foi inserida.

.cncpt275.gif

Sempre ao inserir linhas que alcancem o HWM, essa linha é jogada para frente. Ao encher esse espaço o Oracle aumenta automaticamente esse espaço fixo para que possa ser inserido mais linhas nessa mesma tabela. Abaixo da linha HWM os blocos talvez estejam alocados mas não formatados, então não utilizados. Talvez estejam formatados e utilizados, e por último formatados e não utilizados. Essa última situação ocorre quando a linha tenha sido excluída com o DELETE.

Ao inserirmos mais linhas nessa tabela o Oracle aloca alguns blocos desse espaço, mas formata apenas o espaço que será utilizado para armazenamento das linhas em questão. Ao preencher todos esses blocos, o Oracle faz o mesmo procedimento e empurra a HWM novamente pra frente. Mas existe também uma low HWM, em que todos os blocos abaixo se encontram formatados, pois já contêm dados ou contiveram alguma vez e já fora deletados. Vejam a representação abaixo.

Então ao inserimos novas linhas o Oracle é sempre direcionado a armazenar esses novos dados entre a low HWM e a HWM, ou até mesmo abaixo da low HWM que tenha algum espaço disponível após um DELETE. Podemos ver novamente uma representação disso abaixo.

Quando o espaço entre o Low HWM e o HWM está totalmente preenchido, o HWM é colocado mais pra frente e o Low HWM fica na posição que antes era do HWM conforme a próxima imagem ilustra bem. E assim por diante é que o Oracle trata o espaço físico para armazenamento de novas linhas em uma tabela.

cncpt277.gif

Truncate

Bem, agora que já sabemos que um DELETE vai apagando cada bloco do espaço físico mencionado acima, entendemos o por que que um DELETE sem a cláusula WHERE para apagar a tabela inteira pode demorar tanto e ser tão custoso em termos de performance para o servidor, podemos imaginar uma tabela com milhões de registros para isto.

O TRUNCATE trabalha de forma diferente. Antes nesse artigo vimos muito bem o funcionamento da HWM. E o que Truncate faz é apenas colocar tanto o Low HWM e o HWM no início da tabela, fazendo com que o Oracle pense que acima da HWM está completamente inutilizando liberando assim para que sejam feitas novas inserções.

O Truncate realmente tem uma performance muito melhor e é feito quase que de forma instantânea movendo apenas a posição do HWM ao invés de apagar todos os registros de uma tabela como o DELETE porde fazer.

Assim, da próxima vez que pensarem em apagar por completo uma tabela e manter a sua estrutura, não se esqueçam do Truncate e nunca façam isso com o DELETE. O importante a mencionar também é que o Truncate não tem Rollback ao contrário do DELETE ou seja, não tem volta, pois se trata de um DDL e não DML como vimos no início do artigo.

Referência

– Livro – OCA Oracle Database 12c: SQL Fundamentals I: Exam Guide (Exam 1Z0-061), Ramklass, Roopesh – Oracle Press – Mc Graw Hill

https://docs.oracle.com/cd/E11882_01/server.112/e40540/logical.htm#CNCPT89022

Abraço

Share

You may also like...

Deixe um comentário

O seu endereço de e-mail não será publicado.