TRUNCATE TABLE の使用による全行削除
TRUNCATE TABLE ステートメントを使用すると、ログに記録を残さずに迅速にテーブルのすべての行を削除できます。TRUNCATE TABLE の機能は、WHERE 句を使用しない DELETE ステートメントと同じです。ただし、TRUNCATE TABLE の方が高速で、システムおよびトランザクション ログのリソースも DELETE ほど使用されません。
DELETE ステートメントと比較した場合、TRUNCATE TABLE には次の利点があります。
- 使用されるトランザクション ログの領域が DELETE よりも少ない。
DELETE ステートメントでは、一度に 1 行ずつ削除し、削除した各行のエントリをトランザクション ログに記録します。TRUNCATE TABLE では、テーブルのデータを格納するために使用したデータ ページの割り当てを解除することによってデータを削除します。さらに、ページの割り当ての解除だけをトランザクション ログに記録します。 - 通常使用されるロックが DELETE よりも少ない。
DELETE ステートメントが行ロックを使用して実行されると、削除のためにテーブル内の各行がロックされます。TRUNCATE TABLE では常にテーブルとページがロックされますが、各行はロックされません。 - 例外が発生することなく空のページがテーブル内に残される。
DELETE ステートメントの実行後も、テーブルで空のページを保持できます。たとえば、ヒープ内の空ページの割り当てを解除するには、少なくとも 1 つの排他テーブル ロック (LCK_M_X) が必要です。削除操作でテーブル ロックを使用しない場合、そのテーブル (ヒープ) には空のページが多数含まれることになります。インデックスの場合は、削除操作で空のページが残ることがありますが、これらのページはバックグラウンドのクリーンアップ プロセスによってすぐに割り当てが解除されます。
TRUNCATE TABLE で空になったテーブルの定義は、DELETE の場合と同様に、そのインデックスや他の関連するオブジェクトと共にデータベースの中に残ります。
大きなテーブルの切り捨て
Microsoft SQL Server 2005 には、すべてのエクステントで削除に必要な同時ロックを保持しなくても、エクステントが 128 を超えるテーブルを削除または切り捨てることができる機能が導入されています。詳細については、「ラージ オブジェクトの削除と再構築」を参照してください。
例
次の例では、JobCandidate
テーブルからすべてのデータを削除しています。SELECT
ステートメントを TRUNCATE TABLE
ステートメントの前後に挿入して結果を比較しています。
USE AdventureWorks;
GO
SELECT COUNT(*) AS BeforeTruncateCount
FROM HumanResources.JobCandidate;
GO
TRUNCATE TABLE HumanResources.JobCandidate;
GO
SELECT COUNT(*) AS AfterTruncateCount
FROM HumanResources.JobCandidate;
GO
参照
概念
DELETE の使用による行の削除
結果セット内の行の削除
TOP の使用による削除行数の制限
その他の技術情報
DROP TABLE (Transact-SQL)
TRUNCATE TABLE (Transact-SQL)