我有一些表是我构建的报告汇总的一部分。之后我根本不需要它们。有人提到要截断它们,因为它会更快。
19 回答
从表中删除记录会记录每次删除并为删除的记录执行删除触发器。截断是一个更强大的命令,它可以清空表而不记录每一行。SQL Server 会阻止您截断带有引用它的外键的表,因为需要检查每一行的外键。
截断通常是超快的,非常适合从临时表中清除数据。它确实保留了表的结构以供将来使用。
如果您确实要删除表定义以及数据,只需删除表即可。
有关详细信息,请参阅此 MSDN 文章
DROP TABLE 删除表。
TRUNCATE TABLE 清空它,但将其结构留给未来的数据。
DROP 和 TRUNC 做不同的事情:
截断表
从表中删除所有行而不记录单个行删除。TRUNCATE TABLE 类似于没有 WHERE 子句的 DELETE 语句;但是,TRUNCATE TABLE 速度更快,使用的系统和事务日志资源更少。
删除表
删除一个或多个表定义以及这些表的所有数据、索引、触发器、约束和权限规范。
就速度而言,差异应该很小。无论如何,如果您根本不需要表结构,当然可以使用 DROP。
我认为您的意思是 DELETE TABLE 和 TRUNCATE TABLE 之间的区别。
删除表
从数据库中删除表。
删除表
没有条件删除所有行。如果有触发器和引用,那么这将对每一行进行处理。如果有索引,也会修改索引。
截断表
将行数设置为零并且不记录每一行。它比其他两者都快得多。
这些答案都没有指出这两个操作的重要区别。删除表是可以回滚的操作。 但是,truncate 不能回滚['TRUNCATE TABLE' 也可以回滚]。如果有很多行,以这种方式删除一个非常大的表可能会非常昂贵,因为它们都必须记录在临时空间中,以防您决定回滚它。
通常,如果我想删除一个大表,我会截断它,然后删除它。这样,数据将在没有记录的情况下被删除,并且可以删除表,并且该删除将非常便宜,因为不需要记录数据。
需要指出的是,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 操作无法回滚。
TRUNCATE TABLE 保留所有旧索引和诸如此类的东西。显然,DROP TABLE 会删除该表并要求您稍后重新创建它。
Drop 完全摆脱了表格,同时也删除了定义。Truncate 清空表但不删除定义。
截断表格会清空表格。删除表会完全删除它。任何一个都会很快,但删除它可能会更快(取决于您的数据库引擎)。
如果您不再需要它,请将其删除,以免弄乱您的架构。
删除表 A 而不是截断表 A?一个常见的误解是他们做同样的事情。不是这样。事实上,两者之间有很多不同之处。
DELETE 是基于每行的记录操作。这意味着每行的删除都会被记录并物理删除。
您可以删除任何不会违反约束的行,同时保留外键或任何其他约束。
TRUNCATE 也是一个记录操作,但方式不同。TRUNCATE 记录数据所在的数据页的释放。数据页的解除分配意味着您的数据行仍然实际存在于数据页中,但范围已被标记为空以供重用。这就是使 TRUNCATE 比 DELETE 执行更快的操作的原因。
您不能截断具有任何外键约束的表。您必须删除约束、截断表并重新应用约束。
TRUNCATE 会将任何标识列重置为默认种子值。
truncate 删除所有行,但不删除表本身,它本质上等同于不带 where 子句的删除,但通常更快。
在 SQL 标准中,DROP table 删除表和表模式 - 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/en-us/library/aa260621(SQL.80).aspx
这里的答案与问题相匹配,但我将回答你没有问的问题。“我应该使用截断还是删除?” 如果要从表中删除所有行,通常需要截断,因为它要快得多。为什么要快很多?至少在 Oracle 的情况下,它重置了high water mark。这基本上是对数据的取消引用,并允许数据库将其重用于其他用途。
删除与截断
- 该
DELETE
语句一次删除一行,并在事务日志中为每个删除的行记录一个条目。TRUNCATE TABLE
通过释放用于存储表数据的数据页来删除数据,并仅在事务日志中记录页面释放 - 我们可以使用
WHERE
从句 inDELETE
但TRUNCATE
你不能使用它 - 当
DELETE
使用行锁执行语句时,表中的每一行都被锁定以供删除。TRUNCATE TABLE
总是锁定表和页,但不是每一行 - 语句执行后
DELETE
,表中仍然可以包含空页。如果删除操作不使用表锁,则表(堆)会包含很多空页。对于索引,删除操作可能会留下空页面,尽管这些
页面会被后台清理进程快速释放 TRUNCATE TABLE
从表中删除所有行,但表结构及其列、约束、索引等保留DELETE
声明不RESEED
标识列,但TRUNCATE
声明RESEEDS
列IDENTITY
- 您不能
TRUNCATE TABLE
在以下表格上使用:- 被
FOREIGN KEY
约束引用。(您可以截断具有引用自身的外键的表。) - 参与索引视图。
- 使用事务复制或合并复制发布
- 被
TRUNCATE TABLE
无法激活触发器,因为该操作不记录单个行删除
删除语句
Delete 语句删除表中的行并返回表中删除的行数。在这个语句中,我们使用 where 子句从表中删除数据
- Delete Statement 比 Truncate statement 慢,因为它会一一删除记录
截断语句
截断语句 从表中删除或移除所有行。
- 它比删除语句快,因为它从表中删除了所有记录
- 截断语句不返回从表中删除的行数
删除声明
drop语句删除了所有记录以及表的结构
删除 整个表及其所有结构
truncate delete all rows from table 它与 delete 不同的是它还删除行的索引
删除
DELETE 命令用于从表中删除行。WHERE 子句可用于仅删除某些行。如果未指定 WHERE 条件,则将删除所有行。执行 DELETE 操作后,您需要 COMMIT 或 ROLLBACK 事务以使更改永久化或撤消它。
截短
TRUNCATE 从表中删除所有行。该操作无法回滚......因此,TRUCATE 更快,并且不像 DELETE 那样使用尽可能多的撤消空间。
来自:http ://www.orafaq.com/faq/difference_between_truncate_delete_and_drop_commands