Eu tenho uma pergunta da entrevista, que foi feita durante a minha entrevista. Eu respondi a pergunta, mas o entrevistador não estava tão convencido com a minha resposta. Então, alguém por favor me corrija com meu entendimento?
Q. Por que truncar é DDL Onde como excluir é DML? Ambos fazem quase o mesmo trabalho (removendo linhas)
Resp. Quando estamos usando o Truncate, estamos desalocando todo o espaço alocado pelos dados sem salvar no espaço de desfazer tabela. Mas, no caso de Excluir, estamos colocando todos os dados em espaço de tabela para desfazer e, em seguida, estamos excluindo todos os dados.
Por favor, se alguém souber a melhor resposta para o exposto acima, explique.
Respostas:
A distinção entre DML e DDL não é tão clara quanto seus nomes sugerem; portanto, as coisas ficam um pouco confusas às vezes.
A Oracle classifica
TRUNCATE
claramente como DDL no Guia de Conceitos, masDELETE
como DML.Os principais pontos que colocamos
TRUNCATE
no campo DDL no Oracle, como eu o entendo, são:TRUNCATE
pode alterar os parâmetros de armazenamento (oNEXT
parâmetro) e eles fazem parte da definição do objeto - que está no campo DDL.TRUNCATE
faz um implícitocommit
e não pode ser revertido (aparte o flashback) - a maioria (todas?) das operações DDL no Oracle faz isso, nenhum DML faz.O fato de
TRUNCATE
não correrON DELETE
gatilhos também o diferencia das operações DML normais (mas algumas operações DML de caminho direto também ignoram os gatilhos, portanto esse não é um indicador claro).Essa mesma documentação observa que
DELETE
gera UNDO, masTRUNCATE
não gera , portanto, sua declaração está correta nesse aspecto. (Observe queTRUNCATE
gera algunsREDO
para que o truncamento possa ser repetido em caso de restauração / recuperação.) Mas algunsNOLOGGING
operações também podem produzir UNDO reduzido (não tenho certeza de nenhum), portanto, na minha opinião, esse também não é um indicador claro.Então, resumiria como:
truncate
não é "transacional" no sentido de confirmar e não pode ser revertido e pode modificar os atributos de armazenamento do objeto. Portanto, não é DML comum - a Oracle classifica como DDL.delete
é uma instrução DML comum.fonte
Eu acho que
truncate
é semelhante adrop
,alter
,create
como todos eles trabalham em uma mesa ou seja, todos eles são comandos nível de tabela. Enquanto 'delete' é semelhante ainsert
,select
,update
como a todo o trabalho em um linhas, ou seja, todos eles são comandos de nível de linha.fonte