У меня есть вопрос для интервью, который был задан во время моего интервью. Я ответил на вопрос, но интервьюер не очень убедился в моем ответе. Итак, кто-нибудь, пожалуйста, поправьте меня с моим пониманием?
В. Почему Truncate - это DDL, а как Delete - это DML? Оба выполняют почти одинаковую работу (удаление строк)
Отв. Когда мы используем Truncate, мы освобождаем все пространство, выделенное данными, без сохранения в отменить табличное пространство. Но, в случае удаления, мы помещаем все данные в табличное пространство отмены, а затем удаляем все данные.
Пожалуйста, если кто-нибудь знает лучший ответ на вышесказанное, объясните, пожалуйста.
Ответы:
Различие между 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.источник
Я думаю , что
truncate
это похоже наdrop
,alter
,create
как все они работают на столе то есть все они являются командами уровня таблицы. В то время как «Удалить» подобноinsert
,select
,update
как вся работу над строками , т.е. все они являются командами уровня строки.источник