问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

DELETE与TRUNCATE:SQL Server数据删除命令完全指南

创作时间:
作者:
@小白创作中心

DELETE与TRUNCATE:SQL Server数据删除命令完全指南

引用
1
来源
1.
https://www.mssqltips.com/sqlservertip/7365/delete-vs-truncate-sql-server-quick-reference-guide/

在数据库管理中,删除数据是一个常见的操作。但面对DELETE和TRUNCATE这两个看似相似的命令,究竟应该如何选择?本文将从多个维度对比分析这两个命令的异同,帮助你做出明智的选择。

作为数据库管理员(DBA),你可能会被要求从表中删除特定记录或所有数据。例如,删除超过X年的数据,因为这些数据已不再相关;或者每年清空表中的所有数据,仅保留当年的数据。在这些情况下,你需要保留表结构。那么,应该使用DELETE还是TRUNCATE?如何判断哪个命令最适合你的SQL查询?

在本Microsoft SQL Server教程中,我们将讨论DELETE命令和TRUNCATE命令之间的差异。了解它们的相似之处和不同之处后,你将能够根据具体情况做出更好的选择。为了方便参考,我们还提供了一个对比表格,直观展示两个命令的区别。

SQL DELETE命令

如“快速参考表”(下文)所示,DELETE语句是一种DML命令(数据操作语言)。DELETE语句允许使用WHERE子句来删除满足条件的行或元组。如果没有WHERE子句,表中的所有行(元组)都将被删除。所有被删除的行都会记录在事务日志中,因为这是一个完全记录的事务,如果需要,你可以恢复这些数据。

SQL TRUNCATE命令

TRUNCATE是一个DDL(数据定义语言)命令。它用于删除表中的所有行,不能包含WHERE子句。由于TRUNCATE命令是将所有行作为一个块进行删除,而不是逐行删除,因此它比DELETE命令快得多。

如果在事务中使用TRUNCATE命令,你可以使用ROLLBACK来撤销truncate操作。但是,在应用COMMIT函数后,TRUNCATE命令不允许使用ROLLBACK选项来撤销表中已删除的行。

TRUNCATE操作会在事务日志中完全记录,但与删除所有行的DELETE操作相比,它在日志中占用的空间更少。下图显示了在使用DELETE命令和TRUNCATE命令后日志文件的大小。两个表在结构和数据量上是相同的,如图中“mdf”文件大小所示。

DELETE语句与TRUNCATE语句快速参考

下表是一个快速参考指南,方便随时查阅。虽然它没有涵盖DELETE和TRUNCATE命令之间所有差异,但确实涵盖了两个命令之间许多主要区别。

DELETE
TRUNCATE
DELETE是一个DML命令。
TRUNCATE是一个DDL命令。
DELETE命令可以包含WHERE子句,以删除特定行或元组。
TRUNCATE命令用于删除表中所有数据。不能使用WHERE子句来过滤特定行或元组。
DELETE命令为每条记录设置锁,需要比TRUNCATE命令更多的锁和资源。
TRUNCATE命令只需要在表级锁定,不需要对每行进行锁定。
如果使用BEGIN事务,可以ROLLBACK命令。
如果使用BEGIN事务,可以ROLLBACK命令。
DELETE命令将在事务日志中记录删除行的数据。
TRUNCATE命令仅将删除的表作为一个整体记录在事务日志中。
DELETE命令将激活应用于表的任何触发器,例如审计触发器,除非首先禁用触发器。
TRUNCATE不会激活应用于表的任何触发器。因此,记录删除行的审计触发器不会触发。
DELETE命令不会重新设置表的标识值。
TRUNCATE命令将重新设置(重置)表的标识值。
有外键和/或索引视图对DELETE命令没有影响,只要要删除的行没有被其他表引用。
如果表被外键或任何索引视图引用,则不能使用TRUNCATE命令。

DELETE vs TRUNCATE表语句

我有两个表,每个表包含15,000,000(1500万)行数据,共6列。两个表在结构和数据上完全相同。

在这个第一个示例中,我们将使用DELETE命令获取执行计划和总运行时间。这里是语法:

DELETE FROM Sales.Customers2;
GO

删除1500万行数据总共耗时118秒。我们还可以查看执行计划的样子。

在这个示例中,我们将使用TRUNCATE命令在一个与前一个表完全相同的表上。这里是语法:

TRUNCATE TABLE Sales.Customers3;
GO

删除1500万行数据总共耗时不到1秒。注意,使用TRUNCATE命令时不会生成执行计划。

DELETE vs TRUNCATE SQL命令总结

我们概述了DELETE和TRUNCATE命令的基础知识,讨论了每个命令在Microsoft SQL Server DBMS中的优缺点。我还提供了一个方便打印的表格(速查表)。

那么,哪个选项适合你?这取决于你的需求。如果你只需要删除表中的某些行(元组),则需要使用DELETE命令。但是,如果你需要删除表中的所有记录,那么你应该使用TRUNCATE命令,只要上述所有规则都适用于你的情况。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号