web-dev-qa-db-fra.com

Pourquoi tronquer DDL?

J'ai une question d'entrevue, qui a été posée lors de mon entretien. J'ai répondu à la question, mais l'intervieweur n'était pas aussi convaincu de ma réponse. Alors, quelqu'un peut-il me corriger avec ma compréhension?

Q. Pourquoi tronquer est DDL Où supprimer est DML? Les deux font presque le même travail (supprimer des lignes)

Rép. Lorsque nous utilisons Truncate, nous désallouons tout l'espace alloué par les données sans enregistrer dans l'espace d'annulation de la table. Mais, en cas de suppression, nous mettons toutes les données dans l'espace table d'annulation, puis nous supprimons toutes les données.

S'il vous plaît, si quelqu'un connaît la meilleure réponse pour ce qui précède, veuillez expliquer.

15
Ravi

La distinction DML contre DDL n'est pas aussi claire que leur nom l'indique, donc les choses deviennent parfois un peu boueuses.

Oracle clairement classe TRUNCATE comme DDL dans le Guide des concepts, mais DELETE comme DML.

Les points principaux qui ont mis TRUNCATE dans le camp DDL sur Oracle, si je comprends bien, sont:

  • TRUNCATE peut changer les paramètres de stockage (le paramètre NEXT), et ceux-ci font partie de la définition de l'objet - c'est dans le camp DDL.
  • TRUNCATE fait un commit implicite, et ne peut pas être annulé (flashback de côté) - la plupart (toutes?) des opérations DDL dans Oracle le font, pas DML.

Le fait que TRUNCATE ne s'exécute pas ON DELETE triggers le distingue également des opérations DML normales (mais certaines opérations DML à chemin direct ignorent également les déclencheurs, ce n'est donc pas un indicateur clair).

Cette même documentation note que DELETE génère UNDO, mais pas TRUNCATE, donc votre déclaration est correcte à cet égard. (Notez que TRUNCATE génère un certain REDO de sorte que la troncature peut être relue en cas de restauration/récupération.) Mais certaines opérations NOLOGGING peuvent également produire un UNDO réduit (pas sûr pas du tout), donc ce n'est pas un indicateur clair non plus à mon avis.

Je résumerais donc ainsi:

  • truncate n'est pas "transactionnel" dans le sens où il est validé et ne peut pas être annulé, et peut modifier les attributs de stockage des objets. Ce n'est donc pas du DML ordinaire - Oracle le classe comme DDL.
  • delete est une instruction DML ordinaire.
15
Mat

Je pense que truncate est similaire à drop, alter, create car ils fonctionnent tous sur une table, c'est-à-dire qu'ils sont tous des commandes de niveau table. Tandis que 'supprimer' est similaire à insert, select, update car tout fonctionne sur une ligne, c'est-à-dire que ce sont toutes des commandes de niveau ligne.

2
RahulDeep Attri