在报表汇总中,我构建了一些表。我以后完全不需要它们。有人提到要截断它们,因为这样会更快。
在报表汇总中,我构建了一些表。我以后完全不需要它们。有人提到要截断它们,因为这样会更快。
Answers:
从表中删除记录会记录每次删除,并为删除的记录执行删除触发器。截断是一种更强大的命令,可清空表而不记录每一行。由于需要检查每一行上的外键,因此SQL Server阻止您用引用它的外键截断表。
截断通常是超快的,非常适合清除临时表中的数据。它确实保留了表的结构以备将来使用。
如果您实际上要删除表定义以及数据,只需删除表即可。
有关更多信息,请参见此MSDN文章。
我认为您的意思是DELETE TABLE和TRUNCATE TABLE之间的区别。
滴台
从数据库中删除表。
删除表
无条件删除所有行。如果有触发器和引用,则将对每一行进行处理。如果有一个索引,还将对其进行修改。
截断表
将行计数设置为零,并且不记录每行。与其他两者相比,速度要快得多。
set the row count zero
它实际上将身份值设置回初始身份种子值。
这些答案都没有指出这两个操作之间的重要区别。删除表是可以回滚的操作。 但是,截断不能回滚['TRUNCATE TABLE'也可以回滚]。这样,如果有许多行,则删除非常大的表可能会非常昂贵,因为如果您决定将其回滚,则必须将它们全部记录在临时空间中。
通常,如果我想摆脱一个大表,我会截断它,然后将其删除。这样,无需记录就可以删除数据,并且可以删除表,并且由于无需记录数据,因此删除操作非常便宜。
重要的是要指出,尽管截断只是删除数据,而是离开表,而drop实际上会删除数据和表本身。(假设外键不排除这种动作)
DROP TABLE [table_name];
DROP命令用于从数据库中删除表。这是DDL命令。该表的所有行,索引和特权也将被删除。DROP操作无法回滚。
DELETE FROM [table_name]
WHERE [condition];
DELETE FROM [table_name];
DELETE命令是DML命令。它可以根据WHERE子句中指定的条件从表中删除所有行或某些行。它使用行锁执行,表中的每一行都被锁定以删除。它维护事务日志,因此它比TRUNCATE慢。可以回退DELETE操作。
TRUNCATE TABLE [table_name];
TRUNCATE命令从表中删除所有行。它不会记录每行的删除,而是记录表的数据页的解除分配,这使其比DELETE更快。它使用表锁执行,并且整个表被锁定以删除所有记录。这是DDL命令。TRUNCATE操作无法回滚。
TRUNCATE TABLE保留所有旧索引和其他内容。显然,DROP TABLE将摆脱该表,并要求您稍后重新创建它。
删除TableA而不是TRUNCATE TableA?一个普遍的误解是他们做同样的事情。不是这样 实际上,两者之间有很多差异。
DELETE是每行记录的操作。这意味着将记录每行的删除并进行物理删除。
您可以删除任何不会违反约束的行,同时保留外键或任何其他约束。
TRUNCATE也是一个记录的操作,但是方式不同。TRUNCATE记录数据所在的数据页的重新分配。数据页的重新分配意味着您的数据行实际上仍然存在于数据页中,但是扩展区已被标记为空以供重用。这就是使TRUNCATE更快地执行删除操作的原因。
您不能截断具有任何外键约束的表。您将必须删除约束,截断表,然后重新应用约束。
TRUNCATE会将所有标识列重置为默认种子值。
我对上面的一种说法有更正...“截断不能回滚”
截断可以回滚。在某些情况下,您无法进行截断或删除表,例如,当您具有外键引用时。对于诸如月度报告之类的任务,一旦不再需要它,我可能会丢掉桌子。如果我经常进行汇总报告,那么我可能会保留该表并使用truncate。
希望对您有帮助,这里有一些您应该会觉得有用的信息...
请参阅以下文章以了解更多详细信息:http : //sqlblog.com/blogs/denis_gobo/archive/2007/06/13/1458.aspx
另外,有关删除和截断的更多详细信息,请参见本文:http : //www.sql-server-performance.com/faq/delete_truncate_difference_p1.aspx
谢谢!杰夫
TRUNCATE TABLE在功能上与没有WHERE子句的DELETE语句相同:都删除表中的所有行。但是TRUNCATE TABLE比DELETE更快,并且使用更少的系统和事务日志资源。
DELETE语句一次删除一行,并在事务日志中为每个删除的行记录一个条目。TRUNCATE TABLE通过重新分配用于存储表数据的数据页面来删除数据,并且只有页面取消分配记录在事务日志中。
TRUNCATE TABLE删除表中的所有行,但表结构及其列,约束,索引等仍然保留。标识用于新行的计数器将重置为该列的种子。如果要保留身份计数器,请改用DELETE。如果要删除表定义及其数据,请使用DROP TABLE语句。
您不能在FOREIGN KEY约束引用的表上使用TRUNCATE TABLE;而是使用不带WHERE子句的DELETE语句。由于未记录TRUNCATE TABLE,因此无法激活触发器。
TRUNCATE TABLE不能用于参与索引视图的表。
来自http://msdn.microsoft.com/zh-cn/library/aa260621(SQL.80).aspx
DELETE
语句一次删除一行,并在事务日志中为每个删除的行记录一个条目。TRUNCATE TABLE
通过取消分配用于存储表数据的数据页面来删除数据,并仅在事务日志中记录页面取消分配WHERE
子句,DELETE
但TRUNCATE
不能在其中使用DELETE
使用行锁执行该语句时,表中的每一行都被锁定以删除。TRUNCATE TABLE
始终锁定表和页面,但不锁定每一行DELETE
执行语句后,该表仍可以包含空白页。如果删除操作未使用表锁,则该表(堆)将包含许多空白页。对于索引,删除操作可以留下空白页,尽管这些TRUNCATE TABLE
从表中删除所有行,但表结构及其列,约束,索引等仍保留DELETE
语句不RESEED
标识列,但TRUNCATE
声明RESEEDS
该
IDENTITY
列TRUNCATE TABLE
在以下表上使用:
FOREIGN KEY
约束引用。(您可以截断具有引用自身的外键的表。)TRUNCATE TABLE
无法激活触发器,因为该操作不会记录单个行的删除删除声明
Delete语句删除表行并返回从表中删除的行数。在此语句中,我们使用where子句从表中删除数据
截断语句
截断语句Delete表或从表中删除所有行。
删除声明
Drop语句删除了所有记录以及表的结构
删除
DELETE命令用于从表中删除行。WHERE子句只能用于删除某些行。如果未指定WHERE条件,则将删除所有行。执行DELETE操作后,您需要COMMIT或ROLLBACK事务以使更改永久或撤消。
截短
TRUNCATE删除表中的所有行。操作无法回滚...因此,TRUCATE速度更快,并且使用的撤消空间不如DELETE那样多。
来自:http : //www.orafaq.com/faq/difference_between_truncate_delete_and_drop_commands