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