SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

SQL Server の TRUNCATE TABLE は何を実行しているか

leave a comment

テーブルのデータを瞬時に削除する方法として、TRUNCATE TABLE があります。

TRUNCATE TABLE (Transact-SQL)

DELETE との違いは以下になります。

DELETE ステートメントは、一度に 1 行ずつ削除し、削除した各行のエントリをトランザクション ログに記録します。  TRUNCATE TABLE は、テーブル データを格納するのに使用するデータ ページの割り当てを解除することによってデータを削除し、ページの割り当ての解除だけをトランザクション ログに記録します。

ということで、TRUNCATE TABLE が何をやっているかをざっくりと。

DELETE と TRUNCATE で出力されるログの違いを見ると比較ができます。

imageimage

左が 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 ではトランザクション内でロールバックができます。

Written by masayuki.ozawa

12月 14th, 2014 at 12:10 am

Posted in SQL Server

Tagged with

Leave a Reply

*