我知道drop删除了数据以及表结构,而truncate保留了表结构。
是否删除/截断写入回滚段?
每个单独的 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 语句重置了高水位标记(即零块),因此作业知道所有分配的块都未使用。
在 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/