(これはもともと@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>' after
TRUNCATE /
DELETE`を実行して、クエリオプティマイザーが古い統計によってトリップしないようにします。
TRUNCATE TABLE
代わりに使用することをお勧めしますDELETE FROM
。