360

TRUNCATEDELETESQLの違いは何ですか?

回答がプラットフォーム固有の場合は、それを示してください。

4

32 に答える 32

298

ここに違いのリストがあります。私は 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 を割り当てます。ロールバックされた単一の挿入でも、切り捨て時に新しいデータ オブジェクト 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 を発行することはできません。


ID 列

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;
于 2008-09-26T13:53:40.490 に答える
217

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

+----------------------------------------+----------------------------------------------+
|                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)              |
+----------------------------------------+----------------------------------------------+
于 2012-10-15T17:07:03.680 に答える
24

私が追加しなければならないすべての良い答え:

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

于 2008-09-26T14:28:10.347 に答える
22


完全な記事については、次のリンクをたどってください: http://codaffection.com/sql-server-article/delete-vs-truncate-in-sql-server/

ここに画像の説明を入力

dotnet mob の記事から取得: SQL Server での削除と切り捨て

于 2016-05-14T16:07:08.340 に答える
20

SQL Server または MySQL では、自動インクリメントの PK がある場合、truncate によってカウンターがリセットされます。

于 2008-09-26T13:56:36.070 に答える
12

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

トランケートは、トランザクションのコンテキストでは実行されません。

削除に対する切り捨ての速度の利点は明らかです。その利点は、状況に応じて、些細なものから巨大なものまでさまざまです。

ただし、切り捨てが意図せずに参照整合性を破り、他の制約に違反するのを見てきました。トランザクションの外部でデータを変更することによって得られる力は、ネットなしで綱渡りをするときに継承する責任とバランスを取る必要があります。

于 2008-09-26T14:12:14.393 に答える
10

TRUNCATEは DDL ステートメントDELETEですが、 は DML ステートメントです。両者の違いは次のとおりです。

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

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

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

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

これは、トピックに関連する非常に優れたリンクです。

于 2009-12-09T11:31:44.727 に答える
8

はい、DELETE は遅く、TRUNCATE は高速です。なんで?

DELETE は、レコードを読み取り、制約をチェックし、ブロックを更新し、インデックスを更新し、REDO/UNDO を生成する必要があります。そのすべてに時間がかかります。

TRUNCATE は、データベース内のテーブル (ハイ ウォーター マーク) のポインターを調整するだけで、うんざりします。データがなくなりました。

これはOracle固有のものです。

于 2008-09-27T13:46:01.937 に答える
6

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

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

データベースで作業している間、私たちはそれらの違いを知らずに 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 を使用してテーブルからすべてのデータを誤って削除した場合。コミットされたトランザクションをロールバックできます。最後のバックアップを復元し、削除/切り捨てが行われる直前までトランザクション ログを実行します。

于 2014-08-20T17:32:29.673 に答える
4
于 2015-04-07T09:33:59.243 に答える
4

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

于 2009-03-27T12:26:39.457 に答える
3

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 と DELETE の違いは、SQL 面接でよく聞かれる質問の 1 つです。面接担当者に適切に説明しないと、仕事が犠牲になる可能性があります。問題は、多くの人が気付いていないことです。そのため、YES Truncate はロールバックできると伝えた場合、回答が間違っていると見なされる可能性が高くなります。

于 2014-08-21T14:55:50.123 に答える
2

元の答えに対する小さな修正-削除もかなりの量のやり直しを生成します(元に戻る自体はやり直しによって保護されているため)。これは、自動トレース出力から確認できます。

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
于 2008-09-27T15:26:59.603 に答える
2

消去

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/

于 2013-09-07T12:18:54.550 に答える
1

最大の違いは、truncate はログに記録されない操作であり、delete はログに記録されないことです。

つまり、データベースがクラッシュした場合、truncate で操作されたデータは復元できませんが、delete では復元できます。

詳細はこちら

于 2008-09-26T13:56:46.303 に答える
0

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

MySQLでは、自動インクリメントカウンターは切り捨てでリセットされますが、削除ではリセットされません。

于 2008-09-27T01:08:01.867 に答える
0

dblinkを介してDDLを実行することはできません。

于 2008-09-26T23:44:22.880 に答える
0

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

于 2008-09-26T14:17:41.713 に答える
0

つまり、truncate は何もログに記録しません (そのため、はるかに高速ですが、元に戻すことはできません) が、delete はログに記録されます (より大きなトランザクションの一部である可能性があり、ロールバックなどが行われます)。dev のテーブルに必要のないデータがある場合は、トランザクション ログがいっぱいになるリスクを冒さないため、通常は切り捨てることをお勧めします。

于 2008-09-26T13:56:46.303 に答える
0

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

于 2017-04-26T07:51:53.943 に答える
0

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

于 2016-06-13T04:18:21.470 に答える
0

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

begin Tran
delete from  Employee

select * from Employee
Rollback
select * from Employee
于 2014-07-30T08:32:02.930 に答える
0

SQL の Truncate と Delete は、テーブルからデータを削除または削除するために使用される 2 つのコマンドです。どちらの Sql コマンドも本質的に非常に基本的ですが、使用する前に詳細に慣れるまでは多くの問題が発生する可能性があります。コマンドの選択を誤ると、プロセスが非常に遅くなるか、削除する必要があるデータが多すぎてログ セグメントが十分でない場合、ログ セグメントが爆発することさえあります。そのため、SQL で truncate コマンドと delete コマンドをいつ使用するかを知ることが重要ですが、これらを使用する前に、Truncate と Delete の違いを認識しておく必要があります。それらに基づいて、削除するのに DELETE が適している場合を判断できるはずです。テーブルをパージするには、data または TRUNCATE を使用する必要があります。

参照 チェックここをクリック

于 2014-08-22T18:20:15.580 に答える
-5

TRUNCATEは高速で、DELETEは低速です。

ただし、TRUNCATEには説明責任がありません。

于 2008-09-27T01:17:57.367 に答える