Pular para o conteúdo

Diferenças entre TRUNCATE e DELETE: Saiba como eles apagam os dados de uma tabela

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.

Ma0PaCF 0o MFJofbecpUWLQWR0FCMH3HXVag4P40SPCk4bFeIXjWlvf1cjcMRYkQISG4Q5

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.

Diferenças entre TRUNCATE e DELETE

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

Abraço

Tércio Costa

Tércio Costa

Tércio Costa, formado em Ciências da Computação em 2013 pela UFPB. Tenho experiência em Servidores Windows Server, Linux e banco de dados Oracle desde 2008 juntamente com os seus serviços. Desde então venho aperfeiçoando os meus conhecimentos em produtos Oracle e Sistemas Operacionais. Tenho experiência também em bancos SQL Server, MySQL e PosrgreSQL além da linguagem de programação Java, onde desenvolvi projetos freelance utilizando banco de dados Oracle XE e Java SE.

Mantenho o Blog https://oraclepress.wordpress.com reconhecido pela Oracle Technology Network OTN, onde também sou articulista e sou certificado Oracle Database SQL Certified Expert!

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