Por que o DDL truncado?


15

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.


Comentários não são para discussão prolongada; esta conversa foi movida para o bate-papo .
Paul White 9

Respostas:


14

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 classificaTRUNCATE claramente como DDL no Guia de Conceitos, mas DELETEcomo DML.

Os principais pontos que colocamos TRUNCATEno campo DDL no Oracle, como eu o entendo, são:

  • TRUNCATEpode alterar os parâmetros de armazenamento (o NEXTparâmetro) e eles fazem parte da definição do objeto - que está no campo DDL.
  • TRUNCATEfaz um implícito commite 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 TRUNCATEnã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 DELETEgera UNDO, mas TRUNCATEnão gera , portanto, sua declaração está correta nesse aspecto. (Observe que TRUNCATEgera alguns REDOpara 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:

  • truncatenã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.

Ao criar uma tabela, você pode especificar itens como o espaço de tabela, tamanho inicial, tamanho da próxima extensão, etc. Esses são atributos de armazenamento. Sim, eles fazem parte dos metadados de uma tabela (ou índice ou partição).
Mat

Observe que o padrão SQL lista TRUNCATE no capítulo "Manipulação de dados" junto com INSERT, DELETE e UPDATE.
a_horse_with_no_name

2

Eu acho que truncateé semelhante a drop, alter, createcomo todos eles trabalham em uma mesa ou seja, todos eles são comandos nível de tabela. Enquanto 'delete' é semelhante ainsert , select, updatecomo a todo o trabalho em um linhas, ou seja, todos eles são comandos de nível de linha.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.