1

dropはデータとテーブル構造を削除しますが、truncateテーブル構造を保持します。

セグメントをロールバックするために書き込みを削除/切り捨てますか?

4

4 に答える 4

2

単一の 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 ステートメントがハイ ウォーター マーク (つまり、ゼロ ブロック) をリセットするためです。ジョブは、割り当てられたすべてのブロックが未使用であることを認識します。

于 2010-04-24T09:55:32.133 に答える
1

Oracleでは、ロールバックセグメントはDMLにのみ使用されるため、答えは「いいえ」です。

TRUNCATEはDDLです。

于 2010-04-23T21:54:11.817 に答える
0

ロールバック セグメントへの書き込みを削除して切り捨てます。
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 は中断された操作をロールバックできます。

情報源: Ask Tomの記事

于 2010-04-24T10:44:52.280 に答える
0

このウェブサイトをチェックする必要があります

http://moreno-campos.com/2009/10/19/reversing-the-effect-of-a-truncate-table-in-oracle-11gr2/

于 2015-08-24T22:22:28.800 に答える