web-dev-qa-db-ja.com

SQLのTRUNCATEとDELETEの違いは何ですか

SQLのTRUNCATEDELETEの違いは何ですか?

あなたの答えがプラットフォーム固有のものであれば、それを示してください。

238
David Aldridge

これが違いのリストです。私はOracle特有の機能を強調しました、そしてうまくいけばコミュニティは他のベンダーの特有の違いも追加することができます。ほとんどのベンダーに共通の違いは、見出しのすぐ下にあり、違いが以下に強調表示されています。


総括

テーブルからすべての行をすばやく削除したいときに、それを実行したいことが確実で、そのテーブルに対する外部キーがない場合は、おそらくTRUNCATEの方がDELETEよりも速くなります。 。

以下に詳述するように、システム固有のさまざまな問題を考慮する必要があります。


ステートメントの種類

削除はDML、切り捨てはDDL( DDLおよびDMLとは何ですか?


コミットとロールバック

仕入先による可変

SQL * Server

切り捨てはロールバックできます。

PostgreSQL

切り捨てはロールバックできます。

Oracle

TRUNCATEはDDLであるため、ステートメントの実行前と実行後に1回ずつ、合計2回のコミットが必要です。そのため、切り捨てはロールバックできず、切り捨てプロセスの失敗はとにかくコミットを発行します。

ただし、下記のフラッシュバックを参照してください。


スペース開拓

削除してもスペースは回復されず、切り捨てはスペースを回復します

Oracle

REUSE STORAGE句を使用すると、データセグメントの割り当てが解除されないため、テーブルにデータを再ロードする場合はわずかに効率が良くなります。最高水準点はリセットされます。


行スコープ

Deleteを使用すると、すべての行または行のサブセットのみを削除できます。切り捨ては、すべての行を削除します。

Oracle

表がパーティション化されると、個々のパーティションを個別に切り捨てることができるため、すべての表のデータを部分的に削除することが可能です。


オブジェクトタイプ

削除は、テーブルおよびクラスタ内のテーブルに適用できます。切り捨ては、テーブルまたはクラスタ全体にのみ適用されます。 (Oracle固有の可能性があります)


データオブジェクトID

Oracle

DeleteはデータオブジェクトIDには影響しませんが、truncateは新しいデータオブジェクトIDを割り当てます 除く テーブルが作成されてから挿入されたことは一度もありません。切り捨て時に割り当てられます。


フラッシュバック(Oracle)

フラッシュバックは削除にまたがって機能しますが、切り捨ては操作前の状態へのフラッシュバックを防ぎます。

ただし、11g Release 2以降では、Express Editionを除き、FLASHBACK ARCHIVE機能によってこれが可能になります。

OracleでのFLASHBACKの使用http://docs.Oracle.com/cd/E11882_01/appdev.112/e41502/adfns_flashback.htm#ADFNS638


特権

変数

Oracle

削除は別のユーザーまたはロールに対して表に対して付与できますが、DROP ANY TABLE付与を使用せずに切り捨てを行うことはできません。


やり直し/元に戻す

削除すると、少量のやり直しと大量の元に戻すが発生します。切り捨ては無視できる量のそれぞれを生成します。


索引

Oracle

切り捨て操作は、使用不可能な索引を再び使用可能にします。削除しません。


外部キー

有効な外部キーがテーブルを参照している場合は、切り捨てを適用できません。削除による処理は、外部キーの設定によって異なります。


テーブルロック

Oracle

切り捨てには排他テーブルロックが必要です。削除には共有テーブルロックが必要です。したがって、テーブルロックを無効にすることは、テーブルに対するトランケート操作を防ぐための方法です。


トリガー

DMLトリガーはトランケートでは起動しません。

Oracle

DDLトリガーが利用可能です。


リモート実行

Oracle

データベース・リンクを介して切り捨てを発行することはできません。


アイデンティティー列

SQL * Server

切り捨てはIDENTITY列型の順序をリセットしますが、削除はしません。


結果セット

ほとんどの実装では、DELETEステートメントは削除された行をクライアントに返すことができます。

例えばOracle PL/SQLサブプログラムでは、次のことができます。

DELETE FROM employees_temp
WHERE       employee_id = 299 
RETURNING   first_name,
            last_name
INTO        emp_first_name,
            emp_last_name;
230
David Aldridge

切り捨てと削除の違いは以下のとおりです。

+----------------------------------------+----------------------------------------------+
|                Truncate                |                    Delete                    |
+----------------------------------------+----------------------------------------------+
| We can't Rollback after performing     | We can Rollback after delete.                |
| Truncate.                              |                                              |
|                                        |                                              |
| Example:                               | Example:                                     |
| BEGIN TRAN                             | BEGIN TRAN                                   |
| TRUNCATE TABLE tranTest                | DELETE FROM tranTest                         |
| SELECT * FROM tranTest                 | SELECT * FROM tranTest                       |
| ROLLBACK                               | ROLLBACK                                     |
| SELECT * FROM tranTest                 | SELECT * FROM tranTest                       |
+----------------------------------------+----------------------------------------------+
| Truncate reset identity of table.      | Delete does not reset identity of table.     |
+----------------------------------------+----------------------------------------------+
| It locks the entire table.             | It locks the table row.                      |
+----------------------------------------+----------------------------------------------+
| Its DDL(Data Definition Language)      | Its DML(Data Manipulation Language)          |
| command.                               | command.                                     |
+----------------------------------------+----------------------------------------------+
| We can't use WHERE clause with it.     | We can use WHERE to filter data to delete.   |
+----------------------------------------+----------------------------------------------+
| Trigger is not fired while truncate.   | Trigger is fired.                            |
+----------------------------------------+----------------------------------------------+
| Syntax :                               | Syntax :                                     |
| 1) TRUNCATE TABLE table_name           | 1) DELETE FROM table_name                    |
|                                        | 2) DELETE FROM table_name WHERE              |
|                                        |    example_column_id IN (1,2,3)              |
+----------------------------------------+----------------------------------------------+
155
Bhaumik Patel

DROP

DROPコマンドはデータベースからテーブルを削除します。すべてのテーブルの行、インデックス、特権も削除されます。 DMLトリガーは起動されません。操作はロールバックできません。

切り捨て

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

DELETE

DELETEコマンドは、テーブルから行を削除するために使用されます。 WHERE句を使用して、一部の行のみを削除できます。 WHERE条件が指定されていない場合は、すべての行が削除されます。 DELETE操作を実行した後は、トランザクションをCOMMITまたはROLLBACKして変更を永続的なものにするか、元に戻す必要があります。この操作により、テーブル上のすべてのDELETEトリガが起動されます。

差出人: http://www.orafaq.com/faq/difference_between_truncate_delete_and_drop_commands

35
Mohit Singh

私が付け加えなければならないすべての良い答え。

TRUNCATE TABLEはDML( データ操作言語 )コマンドではなくDDL( データ定義言語 )なので、Delete Triggersは実行されません。

23
polara

SQLサーバーでのDelete Vs Truncateの概要
完全な記事のためにこのリンクに従ってください: http://codaffection.com/sql-server-article/delete-vs-truncate-in-sql-server/

enter image description here

Dotnetの暴徒の記事からの抜粋: SQL ServerでDelete Vs Truncate

19
Shamseer K

SQL ServerまたはMySQLでは、自動インクリメント付きのPKがある場合、truncateはカウンタをリセットします。

15
mathieu

「切り捨ては何もログに記録しません」が正しいです。私はさらに行きます:

トランザクションのコンテキストでは切り捨ては実行されません。

削除よりも切り捨てる方が速度が速いという利点は明らかです。その利点はあなたの状況に応じて、簡単なものから莫大なものまであります。

ただし、意図しないで参照の整合性が破られ、他の制約に違反することがあります。取引の外でデータを修正することによって得られる力は、ネットなしで綱渡りをするときに受け継ぐ責任とのバランスをとる必要があります。

12
Walter Mitty

はい、DELETEは遅く、TRUNCATEは速くなります。どうして?

DELETEはレコードを読み込み、制約をチェックし、ブロックを更新し、インデックスを更新し、そしてやり直し/元に戻すを生成しなければなりません。それはすべて時間がかかります。

TRUNCATEは単にテーブル(最高水準点)とプーフのためにデータベース内のポインタを調整します!データは消えています。

これはOracle固有のAFAIKです。

6
DCookie

TRUNCATEはDDL文であるのに対し、DELETEはDML文です。以下は両者の違いです。

  1. TRUNCATEはDDL( データ定義言語 )ステートメントであるため、変更を永続的なものにするためのコミットは不要です。これが、truncateによって削除されたローをロールバックできなかった理由です。一方、DELETEはDML( データ操作言語 )ステートメントであるため、その効果を永続的なものにするには明示的なコミットが必要です。

  2. TRUNCATEは常にテーブルからすべての行を削除し、テーブルを空のままにしてテーブル構造をそのままにします。一方、where句が使用されている場合、DELETEは条件付きで削除されます。

  3. TRUNCATE TABLEステートメントによって削除された行は復元できないため、TRUNCATEステートメントにwhere節を指定することはできません。

  4. TRUNCATEステートメントは、DELETEステートメントのon deleteトリガーとは対照的に、トリガーを起動しません。

ここ はトピックに関連した非常に良いリンクです。

6

誤って削除/切り捨てを使用してテーブルからすべてのデータを削除した場合。コミットしたトランザクションをロールバックできます。最後のバックアップを復元し、Delete/Truncateが発生する直前までトランザクションログを実行します。

下記の関連情報は ブログ投稿 からのものです。

データベースに取り組んでいる間、私たちはそれらの違いを知らずにDeleteとTruncateを使っています。この記事では、SqlのDeleteとTruncateの違いについて説明します。

削除:

  • 削除はDMLコマンドです。
  • Deleteステートメントは行ロックを使用して実行され、テーブル内の各行は削除のためにロックされます。
  • Where句でフィルタを指定できます。
  • Where条件が存在する場合は、指定されたデータを削除します。
  • 操作は個別にログに記録されるため、アクティビティを削除するとトリガーになります。
  • ログを保持するので切り捨てより遅い

切り捨て

  • 切り捨てはDDLコマンドです。
  • 切り捨てテーブルは常にテーブルとページをロックしますが、各行はロックしません。すべてのデータを削除します。
  • Where条件は使用できません。
  • すべてのデータを削除します。
  • 操作は個々の行の削除をログに記録しないため、切り捨てテーブルはトリガーをアクティブにできません。
  • ログを保存しないため、パフォーマンスが高速です。

注意:Transactionで使用すると、DeleteとTruncateの両方をロールバックできます。トランザクションが完了してコミットされた場合、Truncateコマンドをロールバックすることはできませんが、将来ログファイルからロールバックする必要がある場合に備えて、ログファイルに削除書き込みコマンドを記録するので、削除できません。

切り捨てようとしているテーブルを参照する外部キー制約がある場合、参照元テーブルにデータがない場合でもこれは機能しません。これは、外部キーのチェックがDMLではなくDDLで行われるためです。これは、テーブルに対する外部キー制約を一時的に無効にすることで回避できます。

テーブルの削除はログに記録された操作です。そのため、各行の削除はトランザクションログに記録されるため、遅くなります。 Truncate tableはテーブル内のすべてのローも削除しますが、各ローの削除をログに記録せずにテーブルのデータページの割り当て解除をログに記録するので、高速になります。

〜誤って削除/切り捨てを使用してテーブルからすべてのデータを削除した場合。コミットしたトランザクションをロールバックできます。最後のバックアップを復元し、Delete/Truncateが発生する直前までトランザクションログを実行します。

5
wpzone4u

SQL Server 2005では、あなたはcan切り捨てをロールバックできると思います。

4
Xander

トランザクションにラップされている場合、TRUNCATEはロールバックできます。

以下の2つの参考文献を見て、自分でテストしてください -

http://blog.sqlauthority.com/2007/12/26/sql-server-truncate-cant-be-rolled-back-using-log-files-after-transaction-session-is-closed/

http://sqlblog.com/blogs/kalen_delaney/archive/2010/10/12/tsql-tuesday-11-rolling-back-truncate-table.aspx

TRUNCATE vs. DELETEは、SQLインタビュー中の悪名高い質問の1つです。インタビュアーに適切に説明するようにしてください。問題は、多くの人が気付いていないため、YES Truncateをロールバックできると言った場合、答えが間違っていると考える可能性が最も高いことです。

3
SQLnbe

DELETE

DELETEコマンドは、テーブルから行を削除するために使用されます。 WHERE句を使用して、一部の行のみを削除できます。 WHERE条件が指定されていない場合は、すべての行が削除されます。 DELETE操作を実行した後は、トランザクションをCOMMITまたはROLLBACKして変更を永続的なものにするか、元に戻す必要があります。この操作により、テーブル上のすべてのDELETEトリガが起動されます。

切り捨て

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

DROP

DROPコマンドはデータベースからテーブルを削除します。すべてのテーブルの行、インデックス、特権も削除されます。 DMLトリガーは起動されません。操作はロールバックできません。


DROPとTRUNCATEはDDLコマンドですが、DELETEはDMLコマンドです。したがって、DELETE操作はロールバック(元に戻す)できますが、DROPおよびTRUNCATE操作はロールバックできません。

差出人: http://www.orafaq.com/faq/difference_between_truncate_delete_and_drop_commands

3
MyUserQuestion

これが私の詳しい答えです SQL ServerのDELETEとTRUNCATEの違い

データの削除:まず最初に、両方ともテーブルから行を削除するために使用できます。
しかし、DELETEを使用すると、Tableからだけでなく、VIEWから、またはプロバイダ機能の影響を受けるOPENROWSETまたはOPENQUERYの結果からも行を削除できます。

FROM句:DELETEでは、別のFROM句を使用して、別のテーブルの行に基づいて、あるテーブル/ビュー/ rowset_function_limitedから行を削除することもできます。そのFROM句には通常のJOIN条件を書くこともできます。実際には、SELECTをDELETEに置き換えて列名を削除することで、集約関数を含まないSELECT文からDELETE文を作成できます。
TRUNCATEを使えば、それはできません。

WHERE:TRUNCATEにはWHERE条件を指定できませんが、DELETEには指定できます。つまり、TRUNCATEを使用すると、特定の行または特定の行グループを削除できません。 TRUNCATE TABLEは、WHERE句のないDELETE文に似ています。

パフォーマンス:TRUNCATE TABLEは高速で、使用するシステムおよびトランザクションログのリソースが少なくなります。そしてその理由の1つは、どちらのステートメントでも使用されているロックです。 DELETEステートメントは行ロックを使用して実行され、テーブル内の各行は削除のためにロックされています。 TRUNCATE TABLEは常にテーブルとページをロックしますが、各行はロックしません。

トランザクションログ:DELETE文は一度に1行ずつ削除し、トランザクションログ内の各行に個別のエントリを作成します。
TRUNCATE TABLEは、テーブルデータを格納するために使用されたデータページの割り当てを解除することによってデータを削除し、ページ割り当て解除のみをトランザクションログに記録します。

Pages:DELETE文を実行した後も、テーブルに空のページを含めることができます。 TRUNCATEは、テーブルデータの格納に使用されているデータページの割り当てを解除することによってデータを削除します。

トリガー:TRUNCATEはテーブルの削除トリガーをアクティブにしません。そのため、TRUNCATEを使用している間は細心の注意を払う必要があります。行が削除されたときに自動クリーンアップまたはロギングアクションを実行するためにテーブルにdeleteトリガが定義されている場合は、決してTRUNCATEを使用しないでください。

識別列:テーブルに識別列が含まれる場合、TRUNCATEを使用すると、その列のカウンタはその列に定義されているシード値にリセットされます。シードが定義されていない場合は、デフォルト値1が使用されます。 DELETEはIDカウンタをリセットしません。そのため、IDカウンタを保持したい場合は、代わりにDELETEを使用してください。

レプリケーション:トランザクションレプリケーションまたはマージレプリケーションで使用されるテーブルに対してDELETEを使用できます。
TRUNCATEは、トランザクションレプリケーションまたはマージレプリケーションに関与するテーブルに対しては使用できません。

ロールバック:DELETEステートメントをロールバックできます。
TRUNCATEは、TRANSACTIONブロックで囲まれていてセッションがクローズされていない場合は、ロールバックすることもできます。セッションが閉じられると、TRUNCATEをロールバックすることはできません。

制限事項:DELETE文は、トリガに違反したり、外部キー制約を持つ別のテーブルのデータによって参照されている行を削除しようとすると、失敗することがあります。 DELETEによって複数の行が削除され、削除された行のいずれかがトリガーまたは制約に違反している場合、ステートメントは取り消され、エラーが返され、行は削除されません。
そして、ビューに対してDELETEが使用されている場合、そのビューは更新可能ビューでなければなりません。インデックス付きビューで使用されているテーブルに対してTRUNCATEを使用することはできません。
TRUNCATEは、それ自体を参照する外部キーを持つテーブルでない限り、FOREIGN KEY制約によって参照されるテーブルに対しては使用できません。

2
Mangal Pardeshi

元の解答 - 削除に対する小さな修正でも、かなりの量のREDOが生成されます(元に戻す機能はREDOによって保護されているため)。これはautotrace出力から見られる場合があります:

SQL> delete from t1;

10918 rows deleted.

Elapsed: 00:00:00.58

Execution Plan
----------------------------------------------------------
   0      DELETE STATEMENT Optimizer=FIRST_ROWS (Cost=43 Card=1)
   1    0   DELETE OF 'T1'
   2    1     TABLE ACCESS (FULL) OF 'T1' (TABLE) (Cost=43 Card=1)




Statistics
----------------------------------------------------------
         30  recursive calls
      12118  db block gets
        213  consistent gets
        142  physical reads
    3975328  redo size
        441  bytes sent via SQL*Net to client
        537  bytes received via SQL*Net from client
          4  SQL*Net roundtrips to/from client
          2  sorts (memory)
          0  sorts (disk)
      10918  rows processed
2
CaptainPicard

2つの操作のもう1つの違いは、テーブルにID列が含まれている場合、その列のカウンターはTRUNCATEの下で1にリセットされる(または列に定義されたシード値に)ことです。 DELETEによる影響はありません。

1
westyside

削除

DELETE is a DML command
DELETE you can rollback
Delete = Only Delete- so it can be rolled back
In DELETE you can write conditions using WHERE clause
Syntax – Delete from [Table] where [Condition]

切り捨て

TRUNCATE is a DDL command
You can't rollback in TRUNCATE, TRUNCATE removes the record permanently
Truncate = Delete+Commit -so we can't roll back
You can't use conditions(WHERE clause) in TRUNCATE
Syntax – Truncate table [Table]

詳細はこちら

http://www.zilckh.com/what-is-the-difference-between-truncate-and-delete/

1
user27332

最大の違いは、削除が行われている間は切り捨てがログに記録されない操作であることです。

単純に言うと、データベースがクラッシュした場合、切り捨てによって操作されたデータを回復することはできませんが、削除することで回復できるということです。

もっと詳しく ここ

1
Learning

DELETE文:このコマンドは、where句で指定された条件に基づいてテーブルから行だけを削除するか、条件が指定されていない場合はテーブルからすべての行を削除します。しかし、それはテーブルを含むスペースを解放しません。

SQL DELETEステートメントの構文は次のとおりです。

Table_nameからの削除[WHERE条件];

TRUNCATE文:このコマンドは、テーブルからすべての行を削除し、テーブルを含むスペースを解放するために使用されます。

1
Bhushan Patil

SQLでの切り捨てと削除は、テーブルからデータを削除または削除するために使用される2つのコマンドです。基本的には非常に基本的なものですが、使用する前に詳細に慣れるまで、両方のSqlコマンドは多くの問題を引き起こす可能性があります。あまりにも多くのデータを削除する必要があり、ログセグメントが十分でない場合、コマンドの誤った選択は、非常に遅いプロセスであるか、ログセグメントを膨らませることさえあります。 SQLでどのようにtruncate and deleteコマンドを使用するかを知ることが重要ですが、これらを使用する前に、TruncateとDeleteの違いを知っておく必要があります。テーブルをパージするには、dataまたはTRUNCATEを使用してください。

チェックを参照してください ここをクリック

0
wpzone4u

切り捨てによってSQL Serverに何も記録されないというわけではありません。 truncateは情報を記録しませんが、TRUNCATEを起動したテーブルのデータページの割り当て解除を記録します。

トランザクションの開始時にトランザクションを定義し、切り捨てられたレコードをロールバックした後で回復できる場合は、切り捨てられたレコードをロールバックすることもできます。しかし、コミットされたトランケートトランザクションの後にトランザクションログバックアップからトランケートレコードを回復することはできません。

0
user2587360

これが便利な大きな理由は、数百万行のテーブルのデータをリフレッシュする必要があるが、再構築したくない場合です。 「削除*」は永遠にかかりますが、トランケートのパフォーマンスへの影響はごくわずかです。

0
Jordan Ogren

切り捨てコマンドはテーブルを再初期化するために使用されます。これはテーブルのすべての行を削除するDDLコマンドです。WhereasDELETEは、条件に従って行または行のセットを削除するために使用されるDMLコマンドです。条件が指定されていない場合、このコマンドはテーブルからすべての行を削除します。

0
Rishish

Matthieuの投稿にコメントしたいのですが、まだ担当者がいません...

MySQLでは、自動インクリメントカウンタはtruncateでリセットされますが、deleteではリセットされません。

0
nathan

TRUNCATE TABLEステートメントを発行することで、ログ記録やトランザクション処理を行わずに、テーブル内のすべてのレコードを削除するようにSQL Serverに指示します。

0
Gerald

Microsoft SQL Serverに固有のもう1つの違いはdeleteで、削除されたレコードを追跡するためにoutputステートメントを使用できます。

delete from [SomeTable]
output deleted.Id, deleted.Name

truncateではこれができません。

削除削除するとデータのみが削除され、テーブル構造はそのまま残ります。

これはDML文のロールバックの可能性ありコミット前も後も実行されません。 (それはDML文であるため)。それらは行にロックをかけます、彼らはやり直しを生成します(それの多く)彼らはUNDOテーブルスペースのセグメントを必要とします。削除によってセグメントスペースが解放されることはないため、すべてのレコードが削除されたテーブルには、元のブロックがすべて保持されます。切り捨てても、テーブルの最高水準点はゼロに戻りません。元の位置のままです。削除は、whereステートメントでフィルターされた特定の行を削除します。そしてログはそれのために維持されます。トリガーを起動することができます。切り捨て切り捨てはデータのみを削除し、テーブル構造はそのまま残ります。これはDDLステートメントのロールバックは不可能です(SQL 2005を除く)。それは動作する前にCOMMITを発行し、その後別のCOMMITを発行するので、トランザクションのロールバックは不可能です。 (これはDDL文であるため)行レベルのロックは取得されません。 REDOまたはロールバックは生成されません。それらはUNDOテーブルスペース内のセグメントを必要としません。トランケートはテーブルの最高水準点をゼロに戻します。トランケートはテーブルに関連付けられているページを削除し、すべてのインデックスがリセットされます。トリガは起動されません。ドロップドロップは、データとテーブル構造の両方を永久に削除します。これはDDLステートメントですロールバックはできません実行する前にCOMMITを発行し、その後別のCOMMITを発行するため、トランザクションのロールバックはできません。 (これはDDL文であるため)行レベルのロックは取得されません。 REDOまたはロールバックは生成されません。それらはUNDOテーブルスペース内のセグメントを必要としません。トランケートはテーブルの最高水準点をゼロに戻します。トランケートはテーブルに関連付けられているページを削除し、すべてのインデックスがリセットされます。トリガは起動されません。

0

簡単に言うと、truncateは何もログに記録しません(非常に高速ですが元に戻すことはできません)。一方deleteはログに記録されます(そしてより大きなトランザクションの一部になることができます、ロールバックなど)。あなたがdevのテーブルに欲しくないデータを持っているなら、トランザクションログをいっぱいにする危険を冒さないので、通常は切り捨てた方が良いです。

0
Oskar

Dblinkを介してDDLを行うことはできません。

0
joel garry

切り捨てもここでロールバックできます。

begin Tran
delete from  Employee

select * from Employee
Rollback
select * from Employee
0
Vinay Pandit

DELETEステートメントには特定のレコードを削除するためのWHERE文節を含めることができますが、TRUNCATEステートメントには必要ではなくテーブル全体を消去します。重要なことに、DELETEステートメントは削除された日付を記録しますが、TRUNCATEステートメントは記録しません。

0
Ali