Database 删除/截断和回滚段

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语句,所以没有回滚

我知道drop删除数据和表结构,而truncate保留表结构


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

在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。截断表员工建议详细说明网站的帮助原因。