dropはデータとテーブル構造を削除しますが、truncateはテーブル構造を保持します。
セグメントをロールバックするために書き込みを削除/切り捨てますか?
dropはデータとテーブル構造を削除しますが、truncateはテーブル構造を保持します。
セグメントをロールバックするために書き込みを削除/切り捨てますか?
単一の DDL ステートメントはそれぞれ個別のトランザクションです。これは、データベースがメタデータ (Oracle のデータ ディクショナリ) を管理する必要があるためです。基本的に、常に修正して有効にする必要があるため、メタデータへの変更をロールバックすることはできません。commit
したがって、各 DDL ステートメントの前後に暗黙的に発行されます。これは、ほとんどの、おそらくすべての RDBMS 製品に当てはまります。
TRUNCATE TABLE と DROP TABLE はどちらも DDL ステートメントであり、DDL であるため、ロールバックはありません。最新バージョンの Oracle の Enterprise Edition ライセンスを持っている場合は、FLASHBACK TABLEを使用して、テーブルを BEFORE DROP を含む以前の状態に復元できます。
編集
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 ステートメントがハイ ウォーター マーク (つまり、ゼロ ブロック) をリセットするためです。ジョブは、割り当てられたすべてのブロックが未使用であることを認識します。
Oracleでは、ロールバックセグメントはDMLにのみ使用されるため、答えは「いいえ」です。
TRUNCATEはDDLです。
ロールバック セグメントへの書き込みを削除して切り捨てます。
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 は中断された操作をロールバックできます。
このウェブサイトをチェックする必要があります
http://moreno-campos.com/2009/10/19/reversing-the-effect-of-a-truncate-table-in-oracle-11gr2/