web-dev-qa-db-ja.com

mysql / sqlserverでの切り捨てと削除の比較

Mysql/sqlserver、つまりdelete/truncateについて頭に浮かんだこと

どちらが良いと速いですか?

削除を使用する場所?

切り捨てを使用する場所?

29
user1414880

[〜#〜] delete [〜#〜]

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

[〜#〜] truncate [〜#〜]

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


  • DELETEとTRUNCATEの両方は、TRANSACTIONとともに使用するとロールバックできます(TRUNCATEは、SQL Serverではロールバックできますが、MySQLではロールバックできません)。
  • 自動インクリメントのPKがある場合、truncateはカウンターをリセットします

http://beginner-sql-tutorial.com/sql-delete-statement.htm

95
bgs

最も重要な違いは、DELETE操作はトランザクションに対して安全であり、ログに記録されることです。つまり、DELETEをロールバックできます。 TRUNCATEはトランザクション内で実行できず、ロールバックできません。 TRUNCATEはログに記録されないため、誤って切り捨てられたテーブルの回復は、DELETEからの回復よりもはるかに大きな問題です。

外部キー制約が壊れている場合、DELETEは失敗します。 TRUNCATEは、外部キー制約を尊重しない場合があります(InnoDBテーブルに対してはそうします)。 DELETEは、ON DELETEトリガーを起動します。 TRUNCATEはしません。

もっと早く

切り捨て操作はテーブルを削除して再作成します。これは、特に大きなテーブルの場合、1行ずつ削除するよりもはるかに高速です。

使用する場所

切り捨てる

テーブルが空に設定され、自動インクリメントキーを1にリセットする必要がある場合。すべてのデータを削除するため、DELETEよりも高速です。 DELETEはテーブルをスキャンして、影響を受けた行の数を生成します。

削除する

オプションのWHERE句に基づいて削除する行が必要です。ログが必要で、外部キー制約を適用する

10
naveen goyal

DELETEコマンドは、テーブルから行を削除するために使用されます

TRUNCATEは、テーブルからすべての行を削除します。操作はロールバックできず、トリガーは起動されません。そのため、TRUNCATEはより高速で、DELETEほど多くの取り消しスペースを使用しません。

2

差:

1)テーブルから完全なデータを削除すると、次の自動インクリメントIDは1から始まります。削除は次のIDから始まります。
2)両方とも、構造をそのまま保持し、データのみを削除します。
3)deleteを使用すると、truncateの場合とは異なり、limitを使用できます。

0
Suresh Kamrushi