删除表和截断表之间的区别?
Posted
技术标签:
【中文标题】删除表和截断表之间的区别?【英文标题】:Difference between drop table and truncate table? 【发布时间】:2010-09-13 05:37:18 【问题描述】:我有一些表是我构建的报告汇总的一部分。之后我根本不需要它们。有人提到要截断它们,因为它会更快。
【问题讨论】:
你可以从***.com/questions/2012974/…得到答案 如果截断表,mysql 不会释放硬盘空间。如果你想恢复你的存储空间,你应该删除表而不截断它。 【参考方案1】:删除声明
Delete 语句删除表行并返回从表中删除的行数。在该语句中,我们使用 where 子句从表中删除数据
Delete Statement 比 Truncate 语句慢,因为它是一条一条地删除记录截断语句
Truncate 语句从表中删除或移除所有行。
它比删除语句快,因为它从表中删除了所有记录 Truncate 语句不返回从表中删除的行数放弃声明
Drop 语句删除了所有记录以及表的结构
【讨论】:
【参考方案2】:掉落 删除整个表及其所有结构
截断 从表中删除所有行 它与删除不同的是它还删除行的索引
【讨论】:
【参考方案3】:删除表
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 操作无法回滚。
【讨论】:
这是不正确的。截断和丢弃可以回滚。创建表 dbo.TestTruncate(ID INT) 插入 dbo.TestTruncate(ID) 值(1) 插入 dbo.TestTruncate(ID) 值(2) 插入 dbo.TestTruncate(ID) 值(3) 开始 TRAN 截断表 dbo .TestTruncate DROP TABLE dbo.TestTruncate ROLLBACK SELECT * FROM dbo.TestTruncate DROP TABLE dbo.TestTruncate【参考方案4】:删除
DELETE 命令用于从表中删除行。 WHERE 子句可用于仅删除某些行。如果未指定 WHERE 条件,则将删除所有行。执行 DELETE 操作后,您需要 COMMIT 或 ROLLBACK 事务以使更改永久生效或撤消。
截断
TRUNCATE 从表中删除所有行。该操作无法回滚......因此,TRUCATE 更快,并且不像 DELETE 那样使用太多的撤消空间。
发件人:http://www.orafaq.com/faq/difference_between_truncate_delete_and_drop_commands
【讨论】:
【参考方案5】:在 SQL 标准中,DROP table 删除表和表模式 - TRUNCATE 删除所有行。
【讨论】:
【参考方案6】:删除表 A 而不是截断表 A? 一个常见的误解是他们做同样的事情。不是 所以。其实两者还是有很多不同的。
DELETE 是按行记录的操作。这意味着 每一行的删除都会被记录并被物理删除。
您可以删除任何不会违反约束的行,同时保留外键或任何其他约束。
TRUNCATE 也是一个记录操作,但方式不同。 TRUNCATE 记录数据所在的数据页的释放 存在。数据页的释放意味着您的数据 行仍然实际存在于数据页中,但 范围已被标记为空以供重用。这是什么 使 TRUNCATE 成为比 DELETE 更快的操作。
您不能截断具有任何外键的表 约束。您将不得不删除约束,TRUNCATE 表,然后重新应用约束。
TRUNCATE 会将所有标识列重置为默认种子 价值。
【讨论】:
“每行的删除都会被记录并被物理删除”。你确定这是正确的吗? MSDN Blog 表示不会立即清除它们。这也是 Postgres 的工作原理。【参考方案7】:删除与截断
DELETE
语句一次删除一行并在事务中记录一个条目
记录每个已删除的行。 TRUNCATE TABLE
通过释放数据来移除数据
pages 用于存储表数据并仅记录在
交易记录
我们可以在DELETE
中使用WHERE
子句,但在TRUNCATE
中你不能使用它
当DELETE
语句使用行锁执行时,表中的每一行都被锁定
用于删除。 TRUNCATE TABLE
总是锁定表和页,但不是每一行
在执行DELETE
语句后,表仍可以包含空页。如果
删除操作不使用表锁,表(堆)会包含很多空
页。对于索引,删除操作可能会留下空页,尽管这些
页面将通过后台清理进程快速释放
TRUNCATE TABLE
从表中删除所有行,但表结构及其列,
约束、索引等仍然存在
DELETE
声明不是 RESEED
标识列而是 TRUNCATE
声明 RESEEDS
IDENTITY
专栏
您不能在以下表上使用TRUNCATE TABLE
:
-
被
FOREIGN KEY
约束引用。 (您可以截断具有
引用自身的外键。)
参与索引视图。
使用事务复制或合并复制发布
TRUNCATE TABLE
无法激活触发器,因为该操作没有记录个人
行删除
【讨论】:
【参考方案8】:这些答案都没有指出这两个操作的重要区别。删除表是可以回滚的操作。 但是,truncate 不能回滚 ['TRUNCATE TABLE' 也可以回滚]。这样,如果有很多行,删除一个非常大的表可能会非常昂贵,因为它们都必须记录在一个临时空间中,以防您决定回滚它。
通常,如果我想删除一个大表,我会截断它,然后删除它。这样,数据将在没有记录的情况下被删除,并且可以删除表,并且删除将非常便宜,因为不需要记录数据。
重要的是要指出,尽管 truncate 只是删除数据,离开表,而 drop 实际上会删除数据和表本身。 (假设外键不排除这样的操作)
【讨论】:
这并不完全正确,TRUNCATE 可以在 BEGIN TRANSACTION、TRUNCATE TABLE、ROLLBACK 意义上回滚,只是不能在“恢复事务日志”意义上。它记录页面的释放。 -1DROP
基本上只是一个TRUNCATE
然后从系统表中删除表元数据。 See this question here【参考方案9】:
TRUNCATE TABLE 保留所有旧索引和诸如此类的东西。显然,DROP TABLE 会删除该表并要求您稍后重新创建它。
【讨论】:
【参考方案10】:TRUNCATE TABLE 在功能上是 与没有的 DELETE 语句相同 WHERE 子句:都删除所有行 桌子。但是 TRUNCATE TABLE 是 更快,使用更少的系统和 事务日志资源而不是 DELETE。
DELETE 语句删除第一行 一次并在 每个已删除行的事务日志。 TRUNCATE TABLE 删除数据 释放数据页用于 存储表的数据,并且只有 页面释放记录在 交易记录。
TRUNCATE TABLE 删除所有行 表,但表结构及其 列、约束、索引等 留在。使用的计数器 新行的标识重置为 列的种子。如果你想 保留身份计数器,使用 改为删除。如果你想删除 表定义及其数据,使用 DROP TABLE 语句。
您不能在 由 FOREIGN KEY 引用的表 约束;相反,使用 DELETE 没有 WHERE 子句的语句。 因为没有记录 TRUNCATE TABLE, 它无法激活触发器。
TRUNCATE TABLE 不能用于 参与索引的表 查看。
来自http://msdn.microsoft.com/en-us/library/aa260621(SQL.80).aspx
【讨论】:
【参考方案11】:我对上述陈述之一进行了更正……“截断不能回滚”
截断可以回滚。在某些情况下,您无法执行截断或删除表,例如当您有外键引用时。对于诸如月度报告之类的任务,我可能会在不再需要表格时将其删除。如果我更频繁地执行此汇总报告,那么我可能会保留表格并使用截断。
希望对您有所帮助,这里有一些您应该会觉得有用的更多信息...
请参阅以下文章了解更多详情: http://sqlblog.com/blogs/denis_gobo/archive/2007/06/13/1458.aspx
此外,有关删除与截断的更多详细信息,请参阅这篇文章: http://www.sql-server-performance.com/faq/delete_truncate_difference_p1.aspx
谢谢! 杰夫
【讨论】:
【参考方案12】:我认为您的意思是 DELETE TABLE 和 TRUNCATE TABLE 之间的区别。
删除表格
从数据库中删除该表。
删除表格
没有条件删除所有行。如果有触发器和引用,那么这将对每一行进行处理。如果有索引,也会修改索引。
截断表格
将行计数设置为零并且不记录每一行。它比其他两者都快得多。
【讨论】:
set the row count zero
它实际上将标识值设置回初始标识种子值。【参考方案13】:
这里的答案与问题相符,但我会回答你没有问的问题。 “我应该使用截断还是删除?”如果要从表中删除所有行,通常需要截断,因为它要快得多。为什么要快很多?至少在 Oracle 的情况下,它会重置 high water mark。这基本上是对数据的取消引用,并允许数据库将其重用于其他用途。
【讨论】:
【参考方案14】:DROP 和 TRUNC 做不同的事情:
截断表格
从表中删除所有行 记录单个行删除。 TRUNCATE TABLE 类似于 没有 WHERE 子句的 DELETE 语句; 但是,TRUNCATE TABLE 更快并且 使用更少的系统和事务日志 资源。
删除表格
删除一个或多个表定义 以及所有数据、索引、触发器, 约束和许可 这些表的规格。
就速度而言,差异应该很小。无论如何,如果您根本不需要表结构,请务必使用 DROP。
【讨论】:
【参考方案15】:从表中删除记录会记录每次删除并为删除的记录执行删除触发器。 Truncate 是一个更强大的命令,它可以清空表而不记录每一行。 SQL Server 会阻止您截断带有引用它的外键的表,因为需要检查每一行的外键。
截断通常是超快的,非常适合从临时表中清除数据。它确实保留了表的结构以供将来使用。
如果您确实想要删除表定义以及数据,只需删除表即可。
更多信息请见this MSDN article
【讨论】:
另外,截断表会重置身份种子。这对测试很有帮助,因为您可以截断表并插入数据,并知道每次的标识值是什么。如果您只是删除表中的所有数据,您可以这样做。 The Myth that DROP and TRUNCATE TABLE are Non-Logged。只需多付两美分。【参考方案16】:截断表格会清空表格。删除表会完全删除它。任何一个都会很快,但删除它可能会更快(取决于您的数据库引擎)。
如果您不再需要它,请将其删除,以免混淆您的架构。
【讨论】:
【参考方案17】:Drop 完全摆脱了表格,同时也删除了定义。 Truncate 清空表,但不删除定义。
【讨论】:
【参考方案18】:truncate 删除所有行,但不删除表本身,它本质上相当于不带 where 子句的删除,但通常更快。
【讨论】:
截断更快,因为它不记录事务(我相信),所以你不能像删除一样从截断回滚。【参考方案19】:DROP TABLE 删除表。
TRUNCATE TABLE 清空它,但将其结构留给未来的数据。
【讨论】:
伙计,你知道的远不止这些 ;) 这是关键的区别。以上是关于删除表和截断表之间的区别?的主要内容,如果未能解决你的问题,请参考以下文章