Почему усеченный DDL?


15

У меня есть вопрос для интервью, который был задан во время моего интервью. Я ответил на вопрос, но интервьюер не очень убедился в моем ответе. Итак, кто-нибудь, пожалуйста, поправьте меня с моим пониманием?

В. Почему Truncate - это DDL, а как Delete - это DML? Оба выполняют почти одинаковую работу (удаление строк)

Отв. Когда мы используем Truncate, мы освобождаем все пространство, выделенное данными, без сохранения в отменить табличное пространство. Но, в случае удаления, мы помещаем все данные в табличное пространство отмены, а затем удаляем все данные.

Пожалуйста, если кто-нибудь знает лучший ответ на вышесказанное, объясните, пожалуйста.


Комментарии не для расширенного обсуждения; этот разговор был перенесен в чат .
Пол Уайт 9

Ответы:


14

Различие между DML и DDL не так ясно, как подразумевают их названия, поэтому иногда все становится немного мутнее.

Oracle четко классифицируется TRUNCATEкак DDL в Руководстве по концепциям, но DELETEкак DML.

Основными моментами, которые ставят TRUNCATEв лагерь DDL на Oracle, насколько я понимаю, являются:

  • TRUNCATEможет изменить параметры хранения ( NEXTпараметр), и они являются частью определения объекта - это в лагере DDL.
  • TRUNCATEделает неявный commit, и не может быть откат (без обратной памяти) - большинство (все?) операций DDL в Oracle делают это, никакой DML не делает.

Тот факт, что триггеры TRUNCATEне ON DELETEзапускаются, также отличает его от обычных операций DML (но некоторые операции DML с прямым путем также пропускают триггеры, так что это неочевидный индикатор).

Та же самая документация отмечает, что DELETEгенерирует UNDO, но TRUNCATEне генерирует , поэтому ваше утверждение в этом отношении верно. (Обратите внимание, что TRUNCATEэто генерирует некоторые, REDOтак что усечение может быть воспроизведено в случае восстановления / восстановления.) Но некоторыеNOLOGGING операции также могут привести к уменьшению UNDO (совсем не уверен ни в одном), так что, на мой взгляд, это не является четким показателем.

Итак, я бы подвел итог как:

  • truncateне является «транзакционным» в том смысле, что он фиксирует и не может быть откат, и может изменять атрибуты хранилища объектов. Так что это не обычный DML - Oracle классифицирует его как DDL.
  • delete это обычный оператор DML.

Когда вы создаете таблицу, вы можете указать такие вещи, как, к какому табличному пространству она относится, начальный размер, размер следующего экстента и т. Д. Это атрибуты хранения. Да, они являются частью метаданных таблицы (или индекса, или раздела).
Мат

Обратите внимание, что стандарт SQL перечисляет TRUNCATE в главе «Работа с данными» вместе с INSERT, DELETE и UPDATE.
a_horse_with_no_name

2

Я думаю , что truncateэто похоже на drop, alter, createкак все они работают на столе то есть все они являются командами уровня таблицы. В то время как «Удалить» подобно insert, select, updateкак вся работу над строками , т.е. все они являются командами уровня строки.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.