TRUNCATE
とDELETE
SQLの違いは何ですか?
回答がプラットフォーム固有の場合は、それを示してください。
ここに違いのリストがあります。私は Oracle 固有の機能を強調しましたが、コミュニティが他のベンダー固有の違いも追加できることを願っています。ほとんどのベンダーに共通する相違点は、見出しのすぐ下に記載できます。相違点は以下で強調表示されます。
テーブルからすべての行をすばやく削除したい場合、そしてそれを実行したいことが本当に確実であり、テーブルに対する外部キーがない場合、TRUNCATE はおそらく DELETE よりも高速になります。 .
以下に詳述するように、さまざまなシステム固有の問題を考慮する必要があります。
Delete は DML、Truncate は DDL ( DDL と DML とは? )
ベンダーによる変数
SQLサーバー
Truncate はロールバックできます。
PostgreSQL
Truncate はロールバックできます。
オラクル
TRUNCATE は DDL であるため、文の実行前と実行後に 1 つずつ、計 2 つのコミットが含まれます。したがって、切り捨てをロールバックすることはできず、切り捨てプロセスで障害が発生すると、とにかくコミットが発行されます。
ただし、以下のフラッシュバックを参照してください。
削除はスペースを回復せず、切り捨てはスペースを回復します
オラクル
REUSE STORAGE 句を使用すると、データ セグメントの割り当てが解除されないため、テーブルにデータを再ロードする場合にわずかに効率的になります。最高水準点がリセットされます。
Delete を使用して、すべての行または行のサブセットのみを削除できます。Truncate はすべての行を削除します。
オラクル
テーブルがパーティション化されている場合、個々のパーティションを分離して切り詰めることができるため、テーブルのすべてのデータを部分的に削除することができます。
削除は、クラスター内のテーブルとテーブルに適用できます。Truncate は、テーブルまたはクラスター全体にのみ適用されます。(Oracle固有の可能性があります)
オラクル
削除はデータ オブジェクト ID に影響を与えませんが、テーブルの作成以降にテーブルに対して挿入が行われていない場合を除き、切り捨ては新しいデータ オブジェクト ID を割り当てます。ロールバックされた単一の挿入でも、切り捨て時に新しいデータ オブジェクト ID が割り当てられます。 .
フラッシュバックは削除後も機能しますが、トランケートは操作前の状態へのフラッシュバックを防ぎます。
ただし、Express Edition を除き、11gR2 から FLASHBACK ARCHIVE 機能によりこれが可能になります。
Oracle での FLASHBACK の使用 http://docs.oracle.com/cd/E11882_01/appdev.112/e41502/adfns_flashback.htm#ADFNS638
変数
オラクル
テーブルの削除は別のユーザーまたはロールに付与できますが、切り捨ては DROP ANY TABLE 付与を使用せずに行うことはできません。
削除では、少量のやり直しと大量の取り消しが生成されます。切り捨ては、それぞれのごくわずかな量を生成します。
オラクル
切り捨て操作は、使用できないインデックスを再び使用できるようにします。削除しません。
有効な外部キーがテーブルを参照している場合、切り捨ては適用できません。削除による処理は、外部キーの構成によって異なります。
オラクル
Truncate には排他テーブル ロックが必要で、delete には共有テーブル ロックが必要です。したがって、テーブル ロックを無効にすることは、テーブルでの切り捨て操作を防ぐ方法です。
DML トリガーは切り捨てでは起動しません。
オラクル
DDL トリガーを使用できます。
オラクル
データベース リンクを介して Truncate を発行することはできません。
SQLサーバー
Truncate は IDENTITY カラム タイプのシーケンスをリセットしますが、delete はリセットしません。
ほとんどの実装では、DELETE
ステートメントは削除された行をクライアントに返すことができます。
たとえば、Oracle PL/SQL サブプログラムでは次のことができます。
DELETE FROM employees_temp
WHERE employee_id = 299
RETURNING first_name,
last_name
INTO emp_first_name,
emp_last_name;
切り捨てと削除の違いは次のとおりです。
+----------------------------------------+----------------------------------------------+
| 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) |
+----------------------------------------+----------------------------------------------+
完全な記事については、次のリンクをたどってください: http://codaffection.com/sql-server-article/delete-vs-truncate-in-sql-server/
dotnet mob の記事から取得: SQL Server での削除と切り捨て
SQL Server または MySQL では、自動インクリメントの PK がある場合、truncate によってカウンターがリセットされます。
「切り捨ては何もログに記録しません」は正しいです。私はさらに進みます:
トランケートは、トランザクションのコンテキストでは実行されません。
削除に対する切り捨ての速度の利点は明らかです。その利点は、状況に応じて、些細なものから巨大なものまでさまざまです。
ただし、切り捨てが意図せずに参照整合性を破り、他の制約に違反するのを見てきました。トランザクションの外部でデータを変更することによって得られる力は、ネットなしで綱渡りをするときに継承する責任とバランスを取る必要があります。
TRUNCATE
は DDL ステートメントDELETE
ですが、 は DML ステートメントです。両者の違いは次のとおりです。
TRUNCATE
DDL (データ定義言語) ステートメントと同様に、変更を永続的にするためにコミットする必要はありません。これが、truncate によって削除された行をロールバックできなかった理由です。一方DELETE
、DML(データ操作言語)ステートメントであるため、その効果を永続的にするには明示的なコミットが必要です。
TRUNCATE
常にテーブルからすべての行を削除し、テーブルを空にしてテーブル構造をそのままにしますDELETE
が、where 句が使用されている場合は条件付きで削除できます。
ステートメントによって削除された行TRUNCATE TABLE
は復元できず、TRUNCATE
ステートメントで where 句を指定することはできません。
TRUNCATE
DELETE
ステートメントは、ステートメントの on delete トリガーとは対照的に、トリガーを起動しません
これは、トピックに関連する非常に優れたリンクです。
はい、DELETE は遅く、TRUNCATE は高速です。なんで?
DELETE は、レコードを読み取り、制約をチェックし、ブロックを更新し、インデックスを更新し、REDO/UNDO を生成する必要があります。そのすべてに時間がかかります。
TRUNCATE は、データベース内のテーブル (ハイ ウォーター マーク) のポインターを調整するだけで、うんざりします。データがなくなりました。
これはOracle固有のものです。
誤って削除/切り捨てを使用してテーブルからすべてのデータを削除した場合。コミットされたトランザクションをロールバックできます。最後のバックアップを復元し、削除/切り捨てが行われる直前までトランザクション ログを実行します。
以下の関連情報は、ブログ投稿からのものです。
データベースで作業している間、私たちはそれらの違いを知らずに Delete と Truncate を使用しています。この記事では、Sql での Delete と Truncate の違いについて説明します。
消去:
- 削除は DML コマンドです。
- Delete ステートメントは行ロックを使用して実行され、テーブル内の各行は削除のためにロックされます。
- where句でフィルターを指定できます。
- 条件が存在する場合、指定されたデータを削除します。
- 操作は個別にログに記録されるため、アクティビティをトリガーとして削除します。
- ログを保持するため、Truncate よりも遅い
切り捨てる
- Truncate は DDL コマンドです。
- Truncate table は常にテーブルとページをロックしますが、各行ではなく、すべてのデータを削除します。
- Where 条件は使用できません。
- すべてのデータを削除します。
- 操作では個々の行の削除がログに記録されないため、Truncate table はトリガーをアクティブ化できません。
- ログを保持しないため、パフォーマンスが向上します。
注: Delete と Truncate は、どちらも Transaction で使用するとロールバックできます。トランザクションが完了した場合、コミットされたことを意味し、Truncate コマンドをロールバックすることはできませんが、将来ログ ファイルからロールバックする必要がある場合に備えて、delete 書き込みがログ ファイルにそれらを記録するため、ログ ファイルから Delete コマンドをロールバックすることはできます。
切り捨てようとしているテーブルを参照する外部キー制約がある場合、参照テーブルにデータが含まれていなくても、これは機能しません。これは、外部キーのチェックが DML ではなく DDL で行われるためです。これは、テーブルへの外部キー制約を一時的に無効にすることで回避できます。
テーブルの削除は、ログに記録された操作です。そのため、各行の削除がトランザクション ログに記録されるため、処理が遅くなります。Truncate table もテーブル内のすべての行を削除しますが、各行の削除をログに記録するのではなく、テーブルのデータ ページの割り当て解除をログに記録するため、高速になります。
~ Delete/Truncate を使用してテーブルからすべてのデータを誤って削除した場合。コミットされたトランザクションをロールバックできます。最後のバックアップを復元し、削除/切り捨てが行われる直前までトランザクション ログを実行します。
SQL Server 2005 では、切り捨てをロールバックできると思います
TRUNCATE は、トランザクションにラップされている場合はロールバックできます。
以下の 2 つのリファレンスを参照して、自分でテストしてください。
TRUNCATE と DELETE の違いは、SQL 面接でよく聞かれる質問の 1 つです。面接担当者に適切に説明しないと、仕事が犠牲になる可能性があります。問題は、多くの人が気付いていないことです。そのため、YES Truncate はロールバックできると伝えた場合、回答が間違っていると見なされる可能性が高くなります。
元の答えに対する小さな修正-削除もかなりの量のやり直しを生成します(元に戻る自体はやり直しによって保護されているため)。これは、自動トレース出力から確認できます。
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
消去
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/
最大の違いは、truncate はログに記録されない操作であり、delete はログに記録されないことです。
つまり、データベースがクラッシュした場合、truncate で操作されたデータは復元できませんが、delete では復元できます。
詳細はこちら
matthieuの投稿にコメントしたいのですが、まだ担当者がいません...
MySQLでは、自動インクリメントカウンターは切り捨てでリセットされますが、削除ではリセットされません。
dblinkを介してDDLを実行することはできません。
便利な大きな理由は、数百万行のテーブルのデータを更新する必要があるが、再構築したくない場合です。「削除 *」には永遠に時間がかかりますが、Truncate のパフォーマンスへの影響はごくわずかです。
つまり、truncate は何もログに記録しません (そのため、はるかに高速ですが、元に戻すことはできません) が、delete はログに記録されます (より大きなトランザクションの一部である可能性があり、ロールバックなどが行われます)。dev のテーブルに必要のないデータがある場合は、トランザクション ログがいっぱいになるリスクを冒さないため、通常は切り捨てることをお勧めします。
Truncateコマンドは、テーブルを再初期化するために使用されます。これは、テーブルのすべての行を削除する DDL コマンドです。一方、DELETEは、条件が指定されていない場合、何らかの条件に従って行または行のセットを削除するために使用される DML コマンドです。次に、このコマンドはテーブルからすべての行を削除します。
DELETE ステートメントには、特定のレコードを削除するための WHERE 句を含めることができますが、TRUNCATE ステートメントには必要なく、テーブル全体を消去します。重要なことに、DELETE ステートメントは削除された日付を記録しますが、TRUNCATE ステートメントは記録しません。
ここでは切り捨てをロールバックすることもできます。
begin Tran
delete from Employee
select * from Employee
Rollback
select * from Employee
SQL の Truncate と Delete は、テーブルからデータを削除または削除するために使用される 2 つのコマンドです。どちらの Sql コマンドも本質的に非常に基本的ですが、使用する前に詳細に慣れるまでは多くの問題が発生する可能性があります。コマンドの選択を誤ると、プロセスが非常に遅くなるか、削除する必要があるデータが多すぎてログ セグメントが十分でない場合、ログ セグメントが爆発することさえあります。そのため、SQL で truncate コマンドと delete コマンドをいつ使用するかを知ることが重要ですが、これらを使用する前に、Truncate と Delete の違いを認識しておく必要があります。それらに基づいて、削除するのに DELETE が適している場合を判断できるはずです。テーブルをパージするには、data または TRUNCATE を使用する必要があります。
参照 チェックここをクリック
TRUNCATEは高速で、DELETEは低速です。
ただし、TRUNCATEには説明責任がありません。