#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, но только в том случае, если он был изменен с момента создания таблицы. Вновь созданной (или усеченной) таблице, в которую не было вставок (включая те, которые были немедленно откатаны), не будет назначен новый сегмент данных. Я думаю, что лучше объяснить усечение как назначение нового сегмента данных самостоятельно.#