81

我有一些表是我构建的报告汇总的一部分。之后我根本不需要它们。有人提到要截断它们,因为它会更快。

4

19 回答 19

103

从表中删除记录会记录每次删除并为删除的记录执行删除触发器。截断是一个更强大的命令,它可以清空表而不记录每一行。SQL Server 会阻止您截断带有引用它的外键的表,因为需要检查每一行的外键。

截断通常是超快的,非常适合从临时表中清除数据。它确实保留了表的结构以供将来使用。

如果您确实要删除表定义以及数据,只需删除表即可。

有关详细信息,请参阅此 MSDN 文章

于 2008-09-25T20:07:38.177 回答
88

DROP TABLE 删除表。

TRUNCATE TABLE 清空它,但将其结构留给未来的数据。

于 2008-09-25T20:03:51.523 回答
26

DROP 和 TRUNC 做不同的事情:

截断表

从表中删除所有行而不记录单个行删除。TRUNCATE TABLE 类似于没有 WHERE 子句的 DELETE 语句;但是,TRUNCATE TABLE 速度更快,使用的系统和事务日志资源更少。

删除表

删除一个或多个表定义以及这些表的所有数据、索引、触发器、约束和权限规范。

就速度而言,差异应该很小。无论如何,如果您根本不需要表结构,当然可以使用 DROP。

于 2008-09-25T20:10:27.483 回答
20

我认为您的意思是 DELETE TABLE 和 TRUNCATE TABLE 之间的区别。

删除表

从数据库中删除表。

删除表

没有条件删除所有行。如果有触发器和引用,那么这将对每一行进行处理。如果有索引,也会修改索引。

截断表

将行数设置为零并且不记录每一行。它比其他两者都快得多。

于 2008-09-25T20:06:42.237 回答
11

这些答案都没有指出这两个操作的重要区别。删除表是可以回滚的操作。 但是,truncate 不能回滚['TRUNCATE TABLE' 也可以回滚]。如果有很多行,以这种方式删除一个非常大的表可能会非常昂贵,因为它们都必须记录在临时空间中,以防您决定回滚它。

通常,如果我想删除一个大表,我会截断它,然后删除它。这样,数据将在没有记录的情况下被删除,并且可以删除表,并且该删除将非常便宜,因为不需要记录数据。

需要指出的是,truncate 只是删除数据,离开表,而 drop 实际上会删除数据和表本身。(假设外键不排除这样的动作)

于 2008-09-25T20:16:14.240 回答
6

删除表

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 操作无法回滚。

于 2017-12-06T05:37:33.383 回答
4

TRUNCATE TABLE 保留所有旧索引和诸如此类的东西。显然,DROP TABLE 会删除该表并要求您稍后重新创建它。

于 2008-09-25T20:04:45.157 回答
3

Drop 完全摆脱了表格,同时也删除了定义。Truncate 清空表但不删除定义。

于 2008-09-25T20:04:19.353 回答
3

截断表格会清空表格。删除表会完全删除它。任何一个都会很快,但删除它可能会更快(取决于您的数据库引擎)。

如果您不再需要它,请将其删除,以免弄乱您的架构。

于 2008-09-25T20:04:27.530 回答
3

删除表 A 而不是截断表 A?一个常见的误解是他们做同样的事情。不是这样。事实上,两者之间有很多不同之处。

DELETE 是基于每行的记录操作。这意味着每行的删除都会被记录并物理删除。

您可以删除任何不会违反约束的行,同时保留外键或任何其他约束。

TRUNCATE 也是一个记录操作,但方式不同。TRUNCATE 记录数据所在的数据页的释放。数据页的解除分配意味着您的数据行仍然实际存在于数据页中,但范围已被标记为空以供重用。这就是使 TRUNCATE 比 DELETE 执行更快的操作的原因。

您不能截断具有任何外键约束的表。您必须删除约束、截断表并重新应用约束。

TRUNCATE 会将任何标识列重置为默认种子值。

于 2013-10-05T19:58:39.623 回答
2

truncate 删除所有行,但不删除表本身,它本质上等同于不带 where 子句的删除,但通常更快。

于 2008-09-25T20:04:07.390 回答
2

在 SQL 标准中,DROP table 删除表和表模式 - TRUNCATE 删除所有行。

于 2008-09-25T20:04:44.847 回答
2

我对上述陈述之一进行了更正……“截断不能回滚”

截断可以回滚。在某些情况下,您无法执行截断或删除表,例如当您有外键引用时。对于诸如月度报告之类的任务,我可能会在不再需要表格时将其删除。如果我更频繁地执行此汇总报告,那么我可能会保留表格并使用截断。

希望这会有所帮助,这里有一些您应该会发现有用的信息...

更多详情请参阅以下文章:http: //sqlblog.com/blogs/denis_gobo/archive/2007/06/13/1458.aspx

此外,有关删除与截断的更多详细信息,请参阅本文: http ://www.sql-server-performance.com/faq/delete_truncate_difference_p1.aspx

谢谢!杰夫

于 2008-09-25T20:59:57.957 回答
2

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/en-us/library/aa260621(SQL.80).aspx

于 2008-09-26T01:12:41.237 回答
1

这里的答案与问题相匹配,但我将回答你没有问的问题。“我应该使用截断还是删除?” 如果要从表中删除所有行,通常需要截断,因为它要快得多。为什么要快很多?至少在 Oracle 的情况下,它重置了high water mark。这基本上是对数据的取消引用,并允许数据库将其重用于其他用途。

于 2008-09-25T20:12:04.780 回答
1

删除与截断

  1. DELETE语句一次删除一行,并在事务日志中为每个删除的行记录一个条目。TRUNCATE TABLE通过释放用于存储表数据的数据页来删除数据,并仅在事务日志中记录页面释放
  2. 我们可以使用WHERE从句 inDELETETRUNCATE你不能使用它
  3. DELETE使用行锁执行语句时,表中的每一行都被锁定以供删除。TRUNCATE TABLE总是锁定表和页,但不是每一行
  4. 语句执行后DELETE,表中仍然可以包含空页。如果删除操作不使用表锁,则表(堆)会包含很多空页。对于索引,删除操作可能会留下空页面,尽管这些
    页面会被后台清理进程快速释放
  5. TRUNCATE TABLE从表中删除所有行,但表结构及其列、约束、索引等保留
  6. DELETE声明不RESEED标识列,但TRUNCATE声明RESEEDSIDENTITY
  7. 您不能TRUNCATE TABLE在以下表格上使用:
    1. FOREIGN KEY约束引用。(您可以截断具有引用自身的外键的表。)
    2. 参与索引视图。
    3. 使用事务复制或合并复制发布
  8. TRUNCATE TABLE无法激活触发器,因为该操作不记录单个行删除
于 2010-04-07T09:06:12.420 回答
1

删除语句

Delete 语句删除表中的行并返回表中删除的行数。在这个语句中,我们使用 where 子句从表中删除数据

  • Delete Statement 比 Truncate statement 慢,因为它会一一删除记录

截断语句

截断语句 从表中删除或移除所有行。

  • 它比删除语句快,因为它从表中删除了所有记录
  • 截断语句不返回从表中删除的行数

删除声明

drop语句删除了所有记录以及表的结构

于 2018-03-24T17:39:10.280 回答
1

删除 整个表及其所有结构

truncate delete all rows from table 它与 delete 不同的是它还删除行的索引

于 2018-03-29T08:36:18.663 回答
0

删除

DELETE 命令用于从表中删除行。WHERE 子句可用于仅删除某些行。如果未指定 WHERE 条件,则将删除所有行。执行 DELETE 操作后,您需要 COMMIT 或 ROLLBACK 事务以使更改永久化或撤消它。

截短

TRUNCATE 从表中删除所有行。该操作无法回滚......因此,TRUCATE 更快,并且不像 DELETE 那样使​​用尽可能多的撤消空间。

来自:http ://www.orafaq.com/faq/difference_between_truncate_delete_and_drop_commands

于 2008-12-03T06:03:25.013 回答