Database 删除/截断和回滚段
我知道drop删除数据和表结构,而truncate保留表结构Database 删除/截断和回滚段,database,oracle,truncate,sql-drop,rollbacksegments,Database,Oracle,Truncate,Sql Drop,Rollbacksegments,我知道drop删除数据和表结构,而truncate保留表结构 是否删除/截断写入回滚段?在Oracle中,答案是否,因为回滚段仅用于DML TRUNCATE是DDL。每个DDL语句都是一个离散事务。这是因为数据库需要管理其元数据(Oracle中的数据字典)。基本上,它必须始终正确有效,因此无法回滚对元数据的更改。因此,在每个DDL语句之前和之后都会发出一个隐式的commit。这适用于大多数(可能是所有)RDBMS产品 TRUNCATE TABLE和DROP TABLE都是DDL语句,所以没有回滚
是否删除/截断写入回滚段?在Oracle中,答案是否,因为回滚段仅用于DML
TRUNCATE是DDL。每个DDL语句都是一个离散事务。这是因为数据库需要管理其元数据(Oracle中的数据字典)。基本上,它必须始终正确有效,因此无法回滚对元数据的更改。因此,在每个DDL语句之前和之后都会发出一个隐式的
commit
。这适用于大多数(可能是所有)RDBMS产品
TRUNCATE TABLE和DROP TABLE都是DDL语句,所以没有回滚。如果我们有Oracle最新版本的Enterprise Edition许可证,我们可以使用该许可证将表恢复到以前的状态,包括删除前的状态
编辑
下面是DELETE和TRUNCATE表之间的区别。示例日期如下所示:
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语句重置高水位线(即零块),因此作业知道所有分配的块都未使用。drop和TRUNCATE write to rollback段。
您不能自己回滚,因为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将能够回滚中断的操作
信息来源: 您必须查看此网站
您的问题被标记为
oracle
和mysql
。如果你想让他们都回答你的问题,我想你应该在你的问题中明确这一点。好的。还有一个问题。我知道delete是DML,truncate是DDL。给定名为employees的表,1.delete from employees之间的区别是什么;2.裁减员工;何时使用每个?Truncate要快得多,部分原因是它不会生成回滚。这导致了至少两个重要的区别:它显然不能回滚,并且会立即生效,独立于提交。假设您要清空并重新填充一个表。如果删除、插入、提交,则就其他用户而言,表永远不会为空,如果回滚,则会恢复旧数据。如果您截断、插入、提交,那么所有其他会话都会在截断和提交之间看到一个空表,这可能会导致问题,如果插入失败并回滚,它将保持为空。为了完美起见,请将2更正为2。截断表员工建议详细说明网站的帮助原因。