1

我知道drop删除了数据以及表结构,而truncate保留了表结构。

是否删除/截断写入回滚段?

4

4 回答 4

2

每个单独的 DDL 语句都是一个离散事务。这是因为数据库需要管理它们的元数据(Oracle 中的数据字典)。基本上它必须始终正确且有效,因此对元数据的更改无法回滚。commit因此,在每个 DDL 语句之前和之后都会发出一个隐式。这适用于大多数(可能是所有)RDBMS 产品。

TRUNCATE TABLE 和 DROP TABLE 都是 DDL 语句都是 DDL,所以没有回滚。如果我们有最新版本的 Oracle 的企业版许可证,我们可以使用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 回答