テーブルのデータを瞬時に削除する方法として、TRUNCATE TABLE があります。
DELETE との違いは以下になります。
DELETE ステートメントは、一度に 1 行ずつ削除し、削除した各行のエントリをトランザクション ログに記録します。 TRUNCATE TABLE は、テーブル データを格納するのに使用するデータ ページの割り当てを解除することによってデータを削除し、ページの割り当ての解除だけをトランザクション ログに記録します。
ということで、TRUNCATE TABLE が何をやっているかをざっくりと。
DELETE と TRUNCATE で出力されるログの違いを見ると比較ができます。
左が DELETE 時のログ、右が TRUNCATE 時のログになります。
DELETE を実行した場合は、行が削除の単位となります。
そのため、LOP_DELETE_ROWS の操作が大量に発生していることが確認できます。
# 基本、テーブルの全行のログが書き込まれます。
TRUNCATE した場合には、GAM / IAM / PFS という管理ページに対して割り当て解除のビットを立てることで、テーブルのデータを削除を行います。
この GAM / IAM の操作が [データページの割り当ての解除] にあたるのかと。
SQL Server は TRUNCATE した際には強制的にコミットは行われないので、BEGIN TRAN でトランザクションを開始し、トランザクション内でロールバックした場合には、この GAM / IAM の操作を戻せばよいので、ロールバックが可能となっています。
トランザクションで使用できる Transact-SQL ステートメント で除外されるステートメントとして、TRUNCATE TABLE がないので、SQL Server ではトランザクション内でロールバックができます。