DELETE与TRUNCATE:SQL Server数据删除命令完全指南
DELETE与TRUNCATE:SQL Server数据删除命令完全指南
在数据库管理中,删除数据是一个常见的操作。但面对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命令,只要上述所有规则都适用于你的情况。