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.
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.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.