Каждый отдельный оператор DDL является дискретной транзакцией.Это связано с тем, что базы данных должны управлять своими метаданными (словарь данных в Oracle).По сути, он должен исправлять и проверять все время, поэтому изменения в метаданных не могут быть отменены.Следовательно, неявное значение commit
выдается до и после каждого оператора DDL.Это относится к большинству, возможно, ко всем продуктам СУБД.
И TRUNCATE TABLE, и DROP TABLE являются операторами DDL и являются DDL, поэтому отката нет.Если у нас есть лицензия Enterprise Edition для последней версии Oracle, мы можем использовать FLASHBACK TABLE , чтобы восстановить таблицу до предыдущего состояния, включая BEFORE DROP.
edit
Вот различия между DELETE и TRUNCATE TABLE.Датой примера является эта большая таблица:
SQL> exec dbms_stats.gather_table_stats(user,'BIG_TABLE')
PL/SQL procedure successfully completed.
SQL> select blocks, num_rows
2 from user_tables
3 where table_name = 'BIG_TABLE'
4 /
BLOCKS NUM_ROWS
---------- ----------
15449 2340320
SQL>
Сначала удаление ....
SQL> delete from big_table
2 /
2340320 rows deleted.
Elapsed: 00:01:20.37
SQL>
SQL> exec dbms_stats.gather_table_stats(user,'BIG_TABLE')
PL/SQL procedure successfully completed.
Elapsed: 00:00:10.20
SQL>
SQL> select blocks, num_rows
2 from user_tables
3 where table_name = 'BIG_TABLE'
4 /
BLOCKS NUM_ROWS
---------- ----------
15449 0
Elapsed: 00:00:00.11
SQL>
А теперь усечение ...
SQL> truncate table big_table reuse storage
2 /
Table truncated.
Elapsed: 00:00:08.31
SQL> exec dbms_stats.gather_table_stats(user,'BIG_TABLE')
PL/SQL procedure successfully completed.
Elapsed: 00:00:00.26
SQL>
SQL> select blocks, num_rows
2 from user_tables
3 where table_name = 'BIG_TABLE'
4 /
BLOCKS NUM_ROWS
---------- ----------
0 0
Elapsed: 00:00:00.00
SQL>
Различиямежду очевидны.TRUNCATE намного, намного быстрее.Также он обнулел количество блоков в таблице.Обратите внимание, что даже сбор статистики происходит быстрее после усечения.Это связано с тем, что оператор TRUNCATE сбрасывает верхнюю отметку (т. Е. Нулевые блоки), поэтому задание знает, что все назначенные блоки не используются.