(これはもともと@DaveEの回答に対するコメントでしたが、長くなったため、独自の回答に入れました)
TRUNCATE あるログに記録された操作。それ以外の場合は、ACIDに準拠していない必要があります。しかし、間の違いTRUNCATEとDELETE:
- ログ領域の使用:
TRUNCATE解放されたページ/エクステントのみを記録しますが、DELETE個々の行を記録します。
- ロックの使用:行ロックを使用
TRUNCATEするのDELETEとは対照的に、テーブルロックとページロックを使用するため、一般的にロックの使用は少なくなります**。
IDENTITYシーケンス:TRUNCATEテーブルのIDシーケンスをリセットします(存在する場合)。
(*エクステント= 8ページ。TRUNCATEエクステントがすべて1つのテーブルからの場合はエクステントをログ/削除します。それ以外の場合は、混合エクステントからページをログ/削除します。
**これの1つの副作用はDELETE FROM TABLE、操作が排他的なテーブルロックを取得できるかどうかに応じて、空のページがテーブルに割り当てられたままになる可能性があることです。
だから(元の質問に戻って)、テーブルを空にしているが構造を保持したい場合TRUNCATE TABLEよりも決定的に優れDELETE FROM TABLEています(NB:TRUNCATE別のテーブルの外部キーによって参照されるテーブルでは使用できません)。
@Tulloのコメントに記載されているように、データベースの復旧モデルも確認してください。満杯の場合は、ログのバックアップを開始するか、復旧モデルをシンプルに変更する必要があります。これらのいずれかを実行したら、その空き領域をすべて再利用するために、ログファイルを一度限りの操作(NB:ログファイルのみ)で圧縮することをお勧めします。
最後に、別の注意事項-テーブル統計。UPDATE STATISTICS <TABLENAME>' afterTRUNCATE /DELETE`を実行して、クエリオプティマイザーが古い統計によってトリップしないようにします。
TRUNCATE TABLE代わりに使用することをお勧めしますDELETE FROM。