Как команда TRUNCATE в Oracle может восстановить структуру таблицы после ее удаления?

#oracle

#Oracle

Вопрос:

Команда SQL TRUNCATE в Oracle быстрее, чем DELETE FROM table; в том, что команда TRUNATE сначала полностью удаляет указанную таблицу, а затем создает новую таблицу с той же структурой (может потребоваться уточнение на случай, если я ошибаюсь). Поскольку TRUNCATE является частью DDL, он неявно выдает ФИКСАЦИЮ перед выполнением и после завершения выполнения. Если это так, то таблица, удаляемая командой TRUNCATE, навсегда теряется вместе со всей ее структурой в словаре данных. В таком сценарии, как команда TRUNCATE может сначала удалить таблицу и воссоздать ее с той же структурой?

Ответ №1:

(Обратите внимание, что я работаю в Sybase в области разработки SQL Anywhere, и мой ответ основан на моих знаниях о том, как truncate это реализовано там, но я полагаю, что это похоже и на Oracle.)

Я не верю, что таблица на самом деле удалена и создана заново; содержимое просто выброшено. Это намного быстрее, чем delete from <table> потому что триггеры не нужно выполнять, и вместо того, чтобы удалять строку за раз (как из таблицы, так и из индексов), сервер может просто выбросить все страницы, содержащие строки для этой таблицы и любые индексы.

Ответ №2:

Я думал, что truncate (среди прочего) просто сбрасывает верхнюю отметку.

смотрите:http://download.oracle.com/docs/cd/E11882_01/server.112/e17118/statements_10007.htm#SQLRF01707

однако в http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:2816964500346433991

Понятно, что сегмент данных изменяется после усечения.

Комментарии:

1. Сегмент данных изменяется indded, но только в том случае, если он был изменен с момента создания таблицы. Вновь созданной (или усеченной) таблице, в которую не было вставок (включая те, которые были немедленно откатаны), не будет назначен новый сегмент данных. Я думаю, что лучше объяснить усечение как назначение нового сегмента данных самостоятельно.#