T-SQLには、テーブルからデータを削除できる2つのキーワードがあります。それらは削除です および切り捨て 。これらは、実行していることは似ていますが、使用する方法は大きく異なります。この記事では、これらのキーワードの基本的なメカニズムについて説明します。
TRUNCATEとDELETEの違い
切り捨て:
- TRUNCATEはDDLコマンドです。
- TRUNCATE TABLEは、常にテーブルとページをロックします。ただし、各行がロックされるわけではありません。
- WHERE条件は使用できません。
- このコマンドはすべてのデータを削除します。
- 操作は個々の行の削除をログに記録しないため、TRUNCATETABLEはトリガーをアクティブ化できません。
- ログを保持しないため、パフォーマンスが向上します。
- ロールバックが可能です。
削除:
- DELETEはDMLコマンドです。
- DELETEステートメントは、実行中に行ロックを使用します。テーブルの各行は削除のためにロックされています。
- WHERE句でフィルターを指定できます。
- WHERE条件が存在する場合、コマンドは指定されたデータを削除します。
- 操作は個別にログに記録されるため、DELETEはトリガーをアクティブにします。
- DELETEはログを保持するため、TRUNCATEよりも低速です。
- ロールバックが可能です。
TRUNCATEを使用してデータを削除するにはどうすればよいですか?
次の例では、Personテーブルからすべてのデータを削除します。 選択 ステートメントは、 TRUNCATE TABLEの前後に含まれます 結果を比較するステートメント。
USE AdventureWorks2012;
GO
SELECT COUNT(*) AS BeforeTruncateCount
FROM Person.Person;
GO
TRUNCATE TABLE Person.Person;
GO
SELECT COUNT(*) AS AfterTruncateCount
FROM Person.Person;
GO
いくつかの利点を強調しましょう。
TRUNCATE TABLE コマンドは、テーブルデータの格納に使用されるデータページの割り当てを解除することにより、テーブルからすべての行を削除します。操作が完了すると、テーブルにはゼロページが含まれます。個々の行の削除のログは記録されません。このコマンドは、ページの割り当て解除をトランザクションログに記録します。 切り捨て コマンドはより少ないログスペースを使用します。通常、使用されるロックは少なくなります。このコマンドはテーブルからすべての行を削除しますが、テーブル構造とその列、制約、インデックスなどは残ります。テーブルを削除します。 DROP TABLEを使用する必要があります 。
テーブルにID列が含まれている場合、その列のカウンターは、その列に定義されているシード値にリセットされます。シードが定義されていない場合は、デフォルト値1が使用されます。 IDカウンターを保持するには、 DELETEを使用します 代わりに。
DELETEを使用してすべての行を削除する
次の例では、Personテーブルからすべての行を削除します。
DELETE FROM Person.Person;
GO
削除 行を一度に1つずつ削除します。このコマンドは、削除された各行のトランザクションログに新しいレコードを追加します。 削除 実行中に行ロックを使用します。これは、テーブル内の各行が削除のためにロックされることを意味します。一度削除 が実行されても、テーブルには空のデータページを含めることができます。たとえば、ヒープ内の空のページは、少なくとも排他的(LCK_M_X)テーブルロックがないと割り当てを解除できません。 削除 および切り捨て TRANSACTION と一緒に使用すると、両方をロールバックできます 。
また読む
SQLServerのDELETEテーブルとTRUNCATEテーブルの違い