top of page

Difference between SQL Truncate and SQL Delete statements in SQL Server

Overview What Is Truncate in SQL

Both the TRUNCATE and DELETE statements in SQL Server are used to remove data from a table, but they differ in their functionality basic syntax, performance, and impact on the database. Here’s following table with an overview of the differences between TRUNCATE and DELETE statements:

Functionality:

TRUNCATE: The TRUNCATE statement removes all rows from a table, effectively resetting the table to its original empty state. It removes the data without logging individual row deletions, making it faster than DELETE, especially for large tables.

DELETE: The DELETE statement removes specific rows from a table based on specified criteria. It allows for more granular control over which rows are deleted and can be used with a WHERE clause to selectively delete rows.

Logging:

TRUNCATE: The TRUNCATE statement deallocates data pages used by the table, but it does not log individual row deletions in the transaction log. Instead, it logs the deallocation of the data pages, resulting in minimal logging and faster execution.

DELETE: The DELETE statement logs each row deletion in the transaction log, allowing for the possibility of rolling back individual deletions or the entire transaction. This can result in more extensive logging and slower performance, especially for large tables.

Transaction Safety:

TRUNCATE: The TRUNCATE statement cannot be rolled back within a transaction. Once executed, the data is permanently removed from the table, and it cannot be undone using the ROLLBACK command.

DELETE: The DELETE statement can be rolled back within a transaction using the ROLLBACK command. It provides more transactional control over the deletion process and allows for the possibility of reverting changes.

Use Cases:

TRUNCATE: It is often used to quickly remove all data from a table when you don’t need to worry about individual table lock row deletions or transactional rollback. It is commonly used for bulk data removal in data warehouse scenarios or when resetting staging tables.

DELETE: It is used when you need more control over the deletion process, such as selectively removing specific rows based on criteria, or when you need the ability to either delete command roll back the deletion within a transaction.

In summary, TRUNCATE is faster and less resource-intensive than DELETE, but it does not provide transactional safety or granular control over the deletion process. On the other hand, DELETE offers more control and transactional safety but may be slower for large data removal operations. Choose the appropriate statement based on your specific requirements and use cases.

Restrictions On Truncate Command

The TRUNCATE TABLE command in SQL Server comes with several restrictions that you should be aware of:


Cannot be Used with WHERE Clause: Unlike the DELETE command, you cannot specify a WHERE clause with TRUNCATE TABLE. It removes all rows from the table.


Cannot be Rolled Back: The TRUNCATE TABLE operation cannot be rolled back within a transaction. Once executed, the data is permanently removed from the table.


Requires Table-Level Lock: TRUNCATE TABLE acquires a table-level lock, preventing any other transactions from accessing the table until the operation completes. This can cause blocking if other transactions are trying to access the same table concurrently.


Resets Identity Column: If the table has an identity column, TRUNCATE TABLE resets the identity value to the seed value defined for the column. This behavior is different from DELETE, which retains the current identity value.


Cannot Truncate Table with Referential Integrity Constraints: You cannot use TRUNCATE TABLE on a table that has foreign key constraints referencing it unless all referencing foreign key constraints are disabled or removed. This restriction ensures referential integrity.


Cannot Truncate Table Participating in Indexed Views: If the table is participating in an indexed view, you cannot use TRUNCATE TABLE on it.


Cannot Truncate Table with Replication Enabled: If the table is involved in replication, you cannot use TRUNCATE TABLE on it.


Cannot Truncate Table If Indexed View References It: If the table is referenced by an indexed view, you cannot use TRUNCATE TABLE on it.


Cannot Truncate Table If Published for Transactional Replication: If the table is published for transactional replication, you cannot use TRUNCATE TABLE on it.


Permissions Required: To execute TRUNCATE TABLE, the user must have the ALTER permission on the table or be a member of the sysadmin fixed server role, the db_owner fixed database role, or the db_ddladmin fixed database role.

Understanding these restrictions is essential for using TRUNCATE TABLE effectively and avoiding unintended consequences in your database operations.

Example Truncate Command.

Here’s an example of using the TRUNCATE TABLE statement to remove all rows from a table named MyTable:

-- Create a sample table
CREATE TABLE MyTable (
    ID INT PRIMARY KEY,
    Name VARCHAR(50)
);

-- Insert some sample data
INSERT INTO MyTable (ID, Name) VALUES (1, 'John');
INSERT INTO MyTable (ID, Name) VALUES (2, 'Jane');
INSERT INTO MyTable (ID, Name) VALUES (3, 'Alice');

-- Display the data before truncating
SELECT * FROM MyTable;

-- Truncate the table to remove all rows
TRUNCATE TABLE MyTable;

-- Display the data after truncating (should be empty)
SELECT * FROM MyTable;
 

This example demonstrates the following steps:

Creation of a sample table MyTable with columns ID and Name.

Insertion of some sample data into MyTable.

Display of the data in MyTable before truncating.

Execution of the TRUNCATE TABLE MyTable; statement to remove all rows from the table.

Display of the data in MyTable after truncating, which should show an empty result set since all rows have been removed.

TRUNCATE cannot be rolled back” – Fact or Myth?

It’s a fact. In SQL Server, the TRUNCATE statement cannot be rolled back within a transaction. Once table command is executed, all the data is permanently removed from the table, and it cannot be undone using the ROLLBACK command.

Unlike the DELETE statement, which can be rolled back within a transaction, TRUNCATE is a DDL (Data Definition Language) operation rather than a DML (Data Manipulation Language) operation. This means that it is not logged in the same way as DELETE, and the operation cannot be undone or rolled back within a transaction.

It’s important to exercise caution when using TRUNCATE, especially in production environments, as the data loss resulting from its execution is irreversible. Always ensure that you have a backup or a way to restore the data if needed before using TRUNCATE on critical tables deleting data.

SQL Delete statement and identity values

When you use the DELETE statement to remove rows from a table in SQL Server, it does not affect the identity values of delete specific records or the entire table itself. Identity values (also known as auto-increment or identity columns) are maintained separately from all the records and data itself. Here’s what happens:

Deletion of Rows: The DELETE statement removes rows from the table based on the specified criteria. It does not delete any table space, operation does not alter the structure of the table or the table owner identity column.

Identity Column: If the table has an identity column, the values in this column continue to increase sequentially regardless of the rows that have been a deleted row. The identity column values of temporary table are managed by SQL Server independently of the table data and modification operations.

Gaps in Identity Values: After one or more rows are deleted, the identity values of deleted rows will not be reused. This means that if rows with identity values 1, 2, and 3 are deleted, the next inserted row will have an identity value of 4. There may be gaps in the row lock identity values as a result of deletions.


Resetting Identity Values: If you want to reset the identity column to start from a specific value after deleting rows, you can use the DBCC CHECKIDENT command. For example:

DBCC CHECKIDENT ('YourTableName', RESEED, NewSeedValue);

Replace ‘YourTableName’ with the name of your table and NewSeedValue with the value you want the identity column to start from.

In summary, the DELETE statement removes rows from a table without affecting the identity values. Identity values continue to increase sequentially, and any gaps resulting from deletions are not filled automatically. If you need to reset seed value of the identity column unlike drop table, you can use the DBCC CHECKIDENT command to do so on remain own.

In SQL Server, you can use the TRUNCATE TABLE statement to remove all rows from a table, but it does not support truncating individual partitions of drop table directly. However, you can achieve the same result by switching partitions to an empty table. Here’s how you can do it:


Create an empty table with the same schema as the table you want to truncate partitions from.

CREATE TABLE EmptyTable ( -- Define columns similar to the original table column1 datatype1, column2 datatype2, ... );

Switch Partition to Empty Table: Use the ALTER TABLE … SWITCH PARTITION statement to switch the partition you want to truncate from the original table to the empty table.

ALTER TABLE OriginalTable SWITCH PARTITION partition_number TO EmptyTable;

Replace OriginalTable with the name of your original table, partition_number with the number of the partition you want to truncate, and EmptyTable with the name of the empty table you created.


Truncate the Empty Table: After switching the partition to the empty table, you can truncate the empty table to remove all rows.

TRUNCATE TABLE EmptyTable;

Switch Partition Back: If necessary, you can switch the empty partition back to the original table after truncating it.

ALTER TABLE EmptyTable SWITCH TO OriginalTable PARTITION partition_number;

Replace OriginalTable with the name of your original table and partition_number with the number of the partition.

This process effectively truncates the partition by removing all rows from it. However, be cautious when using partition switching, as it requires careful consideration of the table structure, schemas, constraints on table schema, and table permissions to ensure data integrity and security. Additionally, partition switching is only available for tables with partitioning enabled.

TRUNCATE is generally faster than DELETE for several reasons:

Minimal Logging: When you execute a TRUNCATE statement, SQL Server logs the deallocation of data pages rather than individual row deletions. This results in much less logging activity compared to DELETE, which logs each row deletion individually. Less logging means less overhead and faster execution.

Fewer Locks: TRUNCATE obtains fewer locks compared to DELETE. Instead of locking each row individually, TRUNCATE acquires a bulk update lock on the table. This allows other transactions to continue reading from the table while TRUNCATE is executing, improving concurrency and performance.

No Row-By-Row Processing: TRUNCATE removes all rows from the table in a single operation, without processing each row individually. On the other hand, DELETE processes each row one by one, which can be slower, especially for large tables.

Minimal Transaction Log Growth: Because TRUNCATE deals with deallocation of data pages rather than row-by-row deletions, it results in minimal transaction log growth. This can lead to faster execution and less disk space usage compared to DELETE.

Less Overhead: Since TRUNCATE is a DDL (Data Definition Language) operation, it has less overhead compared to DELETE, which is a DML (Data Manipulation Language) operation. DDL operations are optimized differently by the database engine, resulting in faster execution.

Additional Resources

Another Traning Link That Is Good

Get in Touch

Thanks for submitting!

bottom of page