SQL里TRUNCATE TABLE A 和DLELTE FORM A的作用和区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL里TRUNCATE TABLE A 和DLELTE FORM A的作用和区别相关的知识,希望对你有一定的参考价值。

Oracle是这样的:
1、在功能上,truncate是清空一个表的内容,它相当于delete from table_name。
2、delete是dml操作,truncate是ddl操作;因此,用delete删除整个表的数据时,会产生大量的roolback,占用很多的rollback segments, 而truncate不会。
3、在内存中,用delete删除数据,表空间中其被删除数据的表占用的空间还在,便于以后的使用,另外它是“假相”的删除,相当于windows中用delete删除数据是把数据放到回收站中,还可以恢复,当然如果这个时候重新启动系统(OS或者RDBMS),它也就不能恢复了!
而用truncate清除数据,内存中表空间中其被删除数据的表占用的空间会被立即释放,相当于windows中用shift+delete删除数据,不能够恢复!
4、truncate 调整high water mark 而delete不;truncate之后,TABLE的HWM退回到 INITIAL和NEXT的位置(默认)delete 则不可以。
5、truncate 只能对TABLE,delete 可以是table,view,synonym。
6、TRUNCATE TABLE 的对象必须是本模式下的,或者有drop any table的权限 而 DELETE 则是对象必须是本模式下的,或被授予 DELETE ON SCHEMA.TABLE 或DELETE ANY TABLE的权限。
7、在外层中,truncate或者delete后,其占用的空间都将释放。
8、truncate和delete只删除数据,而drop则删除整个表(结构和数据)
参考技术A TRUNCATE TABLE A 不写入日志文件 运行速度较快,但有外键约束就会出错
DLELTE FORM A 写入日志文件 没有上面的快 ,没限制本回答被提问者采纳

TRUNCATE TABLE 是不是会增加事务日志?

【中文标题】TRUNCATE TABLE 是不是会增加事务日志?【英文标题】:Does TRUNCATE TABLE grows up transaction log?TRUNCATE TABLE 是否会增加事务日志? 【发布时间】:2014-05-24 03:39:39 【问题描述】:

我已经读到 SQL 中 DELETE 和 TRUNCATE TABLE 之间的区别之一是 TRUNCATE 操作不能回滚并且不会触发任何触发器 (as written in this site for example):

问题: 这是否意味着当我 TRUNcATE TABLE 包含数百万条记录时,我不应该影响事务日志文件 - 即事务日志文件不应该在截断时增长 - 对吗?

【问题讨论】:

【参考方案1】:

在 MS SQL Server 中(联机丛书)

与DELETE语句相比,TRUNCATE TABLE具有以下优点:

使用的事务日志空间更少。

DELETE 语句一次删除一个行,并在事务日志中为每个删除的行记录一个条目。 TRUNCATE TABLE 通过解除分配用于存储表数据的数据页来移除数据,并且仅在事务日志中记录页解除分配。

通常使用较少的锁。

当使用行锁执行 DELETE 语句时,表中的每一行都被锁定以进行删除。 TRUNCATE TABLE 始终锁定表(包括模式 (SCH-M) 锁)和页,但不是每一行。

无一例外,零页留在表格中。

执行 DELETE 语句后,表仍可以包含空页。例如,如果没有排他 (LCK_M_X) 表锁,就无法释放堆中的空页。如果删除操作不使用表锁,则表(堆)将包含许多空页。对于索引,删除操作可能会留下空页面,尽管后台清理进程会快速释放这些页面。

TRUNCATE TABLE 删除表中的所有行,但表结构及其列、约束、索引等保留。要删除表定义及其数据,请使用 DROP TABLE 语句。

如果表包含标识列,则该列的计数器将重置为为该列定义的种子值。如果没有定义种子,则使用默认值 1。要保留身份计数器,请改用 DELETE。

发件人:http://msdn.microsoft.com/en-us/library/ms177570.aspx

至原问题:

从技术上讲,TRUNCATE 是从表中释放数据页,从而有效地从中删除所有记录。理论上,此操作可以回滚,直到没有数据页被重新使用。已释放页面上的信息不会被删除,它们仍然在数据文件中可用。数据文件中这些释放的页面可以重新使用(例如分配到另一个表),并且可以覆盖它们上的数据。

事务日志包含在 TRUNCATE 期间从表中释放的页面列表(在 SQL Server 中),但此列表比所有记录的列表短得多,因此事务日志不会增长到相同的程度。

根据不同 RDBMS 上事务和 TRUNCATE 的实现,可以在事务内进行回滚。有时可以在事务提交后进行“回滚”(恢复表),如果页面上的数据仍然完整并且所有信息都可用,但这是一些黑魔法,通常 RDBMS 不直接支持.

【讨论】:

【参考方案2】:

这是否意味着当我 TRUNcATE TABLE 包含数百万条记录时,我不应该影响事务日志文件——即事务日志文件不应该在截断时增长——对吗?

好吧,您没有指定实际的服务器软件,但在所有情况下,我都知道这是正确的。

DELETE 有效地逐行执行,删除记录,触发任何适当的触发器,并将事务添加到日志。

TRUNCATE 只是一次性删除所有数据,不会显着影响事务日志(当然不足以允许回滚)并且不执行触发器。

【讨论】:

@D Stanley - Sql 服务器允许回滚截断。如果我们使用 begin tran - 您可以从头再来一次吗?

以上是关于SQL里TRUNCATE TABLE A 和DLELTE FORM A的作用和区别的主要内容,如果未能解决你的问题,请参考以下文章

TRUNCATE TABLE 语句中可以带有where字句吗

sql 来自https://tombevers.me/2013/10/14/how-to-truncate-a-foreign-key-constrained-table/

SQL中truncate table和delete的区别

SQL—TRUNCATE

sql DELETE,TRUNCATE,DROP TABLE

truncate table 和delete * from的区别