Tengo una pregunta de entrevista, que se hizo durante mi entrevista. Respondí la pregunta, pero el entrevistador no estaba tan convencido con mi respuesta. Entonces, ¿alguien me corrige con mi comprensión?
Q. ¿Por qué Truncar es DDL Donde como Eliminar es DML? Ambos hacen casi el mismo trabajo (eliminar filas)
Resp. Cuando estamos usando Truncate, estamos desasignando todo el espacio asignado por los datos sin guardar en el espacio de deshacer tabla. Pero, en el caso de Eliminar, estamos poniendo todos los datos en el espacio de tabla de deshacer y luego estamos eliminando todos los datos.
Por favor, si alguien sabe la mejor respuesta para lo anterior, explique.
Respuestas:
La distinción entre DML y DDL no es tan clara como implican sus nombres, por lo que a veces las cosas se ponen un poco turbias.
Oracle claramente clasifica
TRUNCATE
como DDL en la Guía de conceptos, peroDELETE
como DML.Los puntos principales que ponen
TRUNCATE
en el campamento DDL en Oracle, según tengo entendido, son:TRUNCATE
puede cambiar los parámetros de almacenamiento (elNEXT
parámetro), y esos son parte de la definición del objeto, eso está en el campamento DDL.TRUNCATE
hace un implícitocommit
y no se puede revertir (flashback aparte): la mayoría (¿todas?) de las operaciones DDL en Oracle hacen esto, no lo hace DML.El hecho de que
TRUNCATE
no ejecuteON DELETE
disparadores también lo distingue de las operaciones normales de DML (pero algunas operaciones directas de DML de ruta directa también omiten los disparadores, por lo que no es un indicador claro).Esa misma documentación señala que
DELETE
genera UNDO, peroTRUNCATE
no lo hace, por lo que su declaración es correcta a este respecto. (Tenga en cuenta queTRUNCATE
genera algoREDO
para que el truncamiento pueda reproducirse en caso de restauración / recuperación). Pero algunasNOLOGGING
operaciones también pueden producir un UNDO reducido (no estoy seguro de nada), por lo que en mi opinión tampoco es un indicador claro.Entonces lo resumiría como:
truncate
no es "transaccional" en el sentido de que se compromete y no se puede revertir, y puede modificar los atributos de almacenamiento de objetos. Por lo tanto, no es un DML ordinario: Oracle lo clasifica como DDL.delete
es una declaración DML ordinaria.fuente
Creo que
truncate
es similar adrop
,alter
,create
ya que todo el trabajo sobre una mesa, es decir que todos ellos son comandos a nivel de tabla. Mientras 'delete' es similar ainsert
,select
,update
como todo el trabajo en una de las filas, es decir, que todos ellos son comandos de nivel de fila.fuente