Eu tenho uma pergunta de entrevista, que foi feita durante a minha entrevista. Respondi à pergunta, mas o entrevistador não ficou tão convencido com a minha resposta. Então, alguém por favor me corrija com o meu entendimento?
P. Por que Truncate é DDL e Delete é DML? Ambos fazem quase o mesmo trabalho (removendo linhas)
Resp. Quando estamos usando Truncar, estamos desalocando todo o espaço alocado pelos dados sem salvar no espaço de tabela de undo. Mas, no caso de Excluir, estamos colocando todos os dados em undo tablespace e, em seguida, estamos excluindo todos os dados.
Por favor, se alguém souber a melhor resposta para o acima, por favor, explique.
A distinção DML versus DDL não é tão clara quanto seus nomes sugerem, então as coisas ficam um pouco confusas às vezes.
A Oracle classifica claramente
TRUNCATE
como DDL no Guia de Conceitos, masDELETE
como DML.Os principais pontos que colocaram
TRUNCATE
no campo DDL no Oracle, pelo que entendi, são:TRUNCATE
pode alterar os parâmetros de armazenamento (oNEXT
parâmetro), e esses são parte da definição do objeto - que está no campo DDL.TRUNCATE
faz um implícitocommit
e não pode ser revertido (flashback à parte) - a maioria (todas?) das operações DDL no Oracle fazem isso, nenhum DML faz.O fato de
TRUNCATE
não executarON DELETE
gatilhos também o diferencia das operações DML normais (mas algumas operações DML de caminho direto também ignoram gatilhos, portanto, esse não é um indicador claro).Essa mesma documentação observa que
DELETE
gera UNDO, masTRUNCATE
não gera, então sua afirmação está correta a esse respeito. (Observe queTRUNCATE
gera algunsREDO
para que o truncamento possa ser repetido em caso de restauração/recuperação.) Mas algumasNOLOGGING
operações também podem produzir UNDO reduzido (não tenho certeza sobre nenhum), então esse não é um indicador claro na minha opinião.Então eu resumiria assim:
truncate
não é "transacional" no sentido de que ele é confirmado e não pode ser revertido e pode modificar os atributos de armazenamento de objetos. Portanto, não é DML comum - a Oracle o classifica como DDL.delete
é uma instrução DML comum.Eu acho que
truncate
é semelhante adrop
,alter
,create
pois todos eles funcionam em uma tabela, ou seja, todos são comandos de nível de tabela. Enquanto 'delete' é semelhante ainsert
,select
,update
pois todos funcionam em linhas, ou seja, todos são comandos de nível de linha.Excluir exclui os dados, Truncar também faz o mesmo. Então, por que truncate é um comando DDL, já que está atuando nos dados, idealmente também deve estar em DML. Isso foi mais perguntado em entrevistas. É porque quando aplicamos truncate internamente, ele descarta a tabela primeiro e depois recria o esquema/estrutura dessa tabela. É por causa disso Truncar é um comando DDL. Então Truncar é uma ação DROP+CREATE