drop table和truncate table之间的区别?
我有一些表格,作为我的报告汇总的一部分。 事后我根本不需要他们。 有人提到截断他们,因为它会更快。
从表中删除logging会logging每个删除操作,并执行已删除logging的删除触发器。 截断是一个更强大的命令,可以在不logging每行的情况下清空表格。 由于需要检查每行的外键,SQL Server会阻止您使用外键引用表来截断表。
截断通常超高速,非常适合清理临时表中的数据。 它确实保留了桌子的结构以备将来使用。
如果您确实想要删除表格定义以及数据,只需删除表格即可。
有关更多信息,请参阅此MSDN文章
DROP TABLE删除表。
TRUNCATE TABLE清空它,但留下它的结构为未来的数据。
DROP和TRUNC做不同的事情:
TRUNCATE TABLE
删除表中的所有行而不logging单个行删除。 TRUNCATE TABLE类似于没有WHERE子句的DELETE语句; 但是,TRUNCATE TABLE速度更快,并使用更less的系统和事务日志资源。
DROP TABLE
删除一个或多个表定义以及这些表的所有数据,索引,触发器,约束和许可规范。
就速度而言,差距应该很小。 无论如何,如果你根本不需要表结构,肯定会使用DROP。
我想你是指DELETE TABLE和TRUNCATE TABLE的区别。
DROP TABLE
从数据库中删除表。
删除表
没有条件删除所有行。 如果有触发器和引用,那么这将处理每一行。 如果有索引,索引也会被修改。
TRUNCATE TABLE
设置行数为零,而不logging每一行。 那两个都快多了。
这些答案都没有指出这两个行动的重要区别。 删除表是一个可以回滚的操作。 但是,truncate不能回滚 ['TRUNCATE TABLE'也可以回滚]。 以这种方式,如果有很多行,那么删除一个非常大的表格会非常昂贵,因为如果您决定将其回滚,那么它们都必须logging在临时空间中。
通常,如果我想摆脱一张大桌子,我会截断它,然后放下它。 这样,数据将被删除而没有logging,并且该表可以被丢弃,并且该丢弃将是非常便宜的,因为不需要logging数据。
尽pipetruncate只是删除数据,离开表,但是drop实际上会删除数据和表本身,这一点很重要。 (假设外键不排除这种行为)
TRUNCATE TABLE保留了所有旧的索引和内容。 显然,DROP TABLE会摆脱表格,并要求您稍后重新创build表格。
Drop完全摆脱了桌面,也删除了定义。 截断清空表,但没有摆脱定义。
截断表格将清空表格。 删除表格完全删除它。 两者中的任何一个都会很快,但是放弃它可能会更快(取决于您的数据库引擎)。
如果你不再需要它,放弃它,所以它不会混淆你的模式。
删除TableA而不是TRUNCATE TableA? 一个常见的误解是他们做同样的事情。 不是这样。 事实上,两者有很多不同之处。
DELETE是每行logging的操作。 这意味着每一行的删除操作都被logging并被物理删除。
您可以删除任何不违反约束的行,同时留下外键或任何其他限制。
TRUNCATE也是一个日志操作,但方式不同。 TRUNCATElogging数据存在的数据页的取消分配。 数据页的重新分配意味着您的数据行实际上仍然存在于数据页中,但是这些扩展区已被标记为空以供重用。 这是什么使TRUNCATE更快的操作来执行DELETE。
您不能TRUNCATE有任何外键约束的表。 你将不得不删除限制,截断表,并重新应用限制。
TRUNCATE会将任何标识列重置为默认种子值。
截断删除所有的行,但不是表本身,它基本上相当于删除没有where子句,但通常更快。
我对上面的语句之一进行了更正…“截断不能回滚”
截断可以回滚。 在某些情况下,如果您不能执行截断或删除表(例如当您有外键引用时)。 对于诸如月度报告之类的任务,我可能只是在我不需要它的时候就把这个表丢掉了。 如果我正在做更多的汇总报告,那么我可能会保留表格,并使用truncate。
希望这有助于,这里有一些更多的信息,你应该find有用的…
有关更多详细信息,请参阅以下文章: 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在function上与不带WHERE子句的DELETE语句相同:都删除表中的所有行。 但是TRUNCATE TABLE比DELETE使用更less的系统和事务日志资源。
DELETE语句一次删除一行,并在事务日志中logging每个删除行的条目。 TRUNCATE TABLE通过释放用于存储表数据的数据页来删除数据,并且只有页解除分配被logging在事务日志中。
TRUNCATE TABLE删除表中的所有行,但表结构及其列,约束,索引等依然存在。 新行的标识使用的计数器重置为列的种子。 如果您想保留身份计数器,请使用DELETE。 如果要删除表定义及其数据,请使用DROP TABLE语句。
您不能在由FOREIGN KEY约束引用的表上使用TRUNCATE TABLE; 而是使用DELETE语句,而不使用WHERE子句。 由于TRUNCATE TABLE未logging,因此无法激活触发器。
TRUNCATE TABLE不能用于参与索引视图的表格。
从http://msdn.microsoft.com/en-us/library/aa260621(SQL.80).aspx
在SQL标准中,DROP表删除表和表模式 – TRUNCATE删除所有行。
这里的答案与这个问题相匹配,但我要回答你没有问的问题。 “我应该使用截断还是删除?” 如果您要从表中删除所有行,则通常需要截断,因为速度要快得多。 为什么它要快得多? 至less在Oracle的情况下,它重置高水位 。 这基本上是对数据的解引用,并允许数据库重用其他的东西。
删除VS TRUNCATE
-
DELETE
语句一次删除一行,并在事务日志中logging每个删除行的条目。TRUNCATE TABLE
通过释放用于存储表数据的数据页来删除数据,并仅在事务日志中logging页释放 - 我们可以在
DELETE
使用WHERE
子句,但在TRUNCATE
中不能使用它 - 当使用行锁执行
DELETE
语句时,表中的每一行都被locking以供删除。TRUNCATE TABLE
总是locking表格和页面,但不locking每一行 - 执行
DELETE
语句后,该表仍可以包含空白页。如果删除操作不使用表锁,表(堆)将包含许多空白页。 对于索引,删除操作可以留下空白页面,虽然这些
页面将通过后台清理过程快速释放 -
TRUNCATE TABLE
删除TRUNCATE TABLE
中的所有行,但表结构及其列,约束,索引等依然存在 -
DELETE
语句不RESEED
标识列但TRUNCATE
语句RESEEDS
IDENTITY
列 - 在以下表格上不能使用
TRUNCATE TABLE
:- 由
FOREIGN KEY
约束引用。 (您可以截断具有引用自身的外键的表。) - 参与索引视图。
- 通过使用事务复制或合并复制发布
- 由
-
TRUNCATE TABLE
无法激活触发器,因为该操作不会logging单个行删除
删除
DELETE命令用于从表中删除行。 WHERE子句可以用来只删除一些行。 如果未指定WHERE条件,则将删除所有行。 执行DELETE操作后,您需要COMMIT或ROLLBACK事务以使更改永久或撤消。
截短
TRUNCATE删除表中的所有行。 操作无法回滚…因此,TRUCATE速度更快,不会像DELETE那样使用太多的撤消空间。
来自: http : //www.orafaq.com/faq/difference_between_truncate_delete_and_drop_commands