sql >> データベース >  >> RDS >> Sqlserver

SQL Server:DELETEとTRUNCATE

    T-SQLには、テーブルからデータを削除できる2つのキーワードがあります。それらは削除です および切り捨て 。これらは、実行していることは似ていますが、使用する方法は大きく異なります。この記事では、これらのキーワードの基本的なメカニズムについて説明します。

    TRUNCATEとDELETEの違い

    切り捨て:

    1. TRUNCATEはDDLコマンドです。
    2. TRUNCATE TABLEは、常にテーブルとページをロックします。ただし、各行がロックされるわけではありません。
    3. WHERE条件は使用できません。
    4. このコマンドはすべてのデータを削除します。
    5. 操作は個々の行の削除をログに記録しないため、TRUNCATETABLEはトリガーをアクティブ化できません。
    6. ログを保持しないため、パフォーマンスが向上します。
    7. ロールバックが可能です。

    削除:

    1. DELETEはDMLコマンドです。
    2. DELETEステートメントは、実行中に行ロックを使用します。テーブルの各行は削除のためにロックされています。
    3. WHERE句でフィルターを指定できます。
    4. WHERE条件が存在する場合、コマンドは指定されたデータを削除します。
    5. 操作は個別にログに記録されるため、DELETEはトリガーをアクティブにします。
    6. DELETEはログを保持するため、TRUNCATEよりも低速です。
    7. ロールバックが可能です。

    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テーブルの違い


    1. SQLでの2つの日付間の完全な月数の計算

    2. MariaDBでのQUARTER()のしくみ

    3. PHPを使用してデータベースから画像を表示する方法

    4. Postgresqlでbigintフィールドを日付にフォーマットする方法は?