падение / усечение и откат сегмента - PullRequest
1 голос
/ 24 апреля 2010

Я знаю, что drop удаляет данные, а также структуру таблицы, тогда как truncate сохраняет структуру таблицы.

Отбрасывает / усекает запись для отката сегмента?

Ответы [ 4 ]

2 голосов
/ 24 апреля 2010

Каждый отдельный оператор 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 сбрасывает верхнюю отметку (т. Е. Нулевые блоки), поэтому задание знает, что все назначенные блоки не используются.

1 голос
/ 24 апреля 2010

В Oracle ответ «Нет», поскольку сегменты отката используются только для DML.

TRUNCATE - это DDL.

0 голосов
/ 25 августа 2015
0 голосов
/ 24 апреля 2010

Отбрасывание и усечение записи в сегмент отката.
Вы просто не можете выполнить откат самостоятельно, потому что Oracle выполняет каждый оператор DDL в отдельной транзакции, которая автоматически запускается и фиксируется.

Работает так:

begin
    COMMIT; -- any outstanding work
    begin
       DDL statement;
       COMMIT; -- the DDL statement
    exception
       when others then
            ROLLBACK;  -- any work done by the DDL
            RAISE;     -- reraise the exception back to the client
    end;
end;

В случае сбоя системы в середине инструкции DDL Oracle сможет откатить прерванную операцию.

Источник информации: статья на Спроси Тома .

...