¿Por qué es DDL truncado?


15

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.


Los comentarios no son para discusión extendida; Esta conversación se ha movido al chat .
Paul White 9

Respuestas:


14

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 TRUNCATEcomo DDL en la Guía de conceptos, pero DELETEcomo DML.

Los puntos principales que ponen TRUNCATEen el campamento DDL en Oracle, según tengo entendido, son:

  • TRUNCATEpuede cambiar los parámetros de almacenamiento (el NEXTparámetro), y esos son parte de la definición del objeto, eso está en el campamento DDL.
  • TRUNCATEhace un implícito commity 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 TRUNCATEno ejecute ON DELETEdisparadores 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 DELETEgenera UNDO, pero TRUNCATEno lo hace, por lo que su declaración es correcta a este respecto. (Tenga en cuenta que TRUNCATEgenera algo REDOpara que el truncamiento pueda reproducirse en caso de restauración / recuperación). Pero algunas NOLOGGINGoperaciones 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:

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

Cuando crea una tabla, puede especificar cosas como en qué espacio de tabla va, tamaño inicial, tamaño de extensión siguiente, etc. Esos son atributos de almacenamiento. Sí, son parte de los metadatos de una tabla (o índice o partición).
Mat

Tenga en cuenta que el estándar SQL enumera TRUNCATE en el capítulo "Manipulación de datos" junto con INSERT, DELETE y UPDATE.
a_horse_with_no_name

2

Creo que truncatees similar a drop, alter, createya que todo el trabajo sobre una mesa, es decir que todos ellos son comandos a nivel de tabla. Mientras 'delete' es similar a insert, select, updatecomo todo el trabajo en una de las filas, es decir, que todos ellos son comandos de nivel de fila.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.