web-dev-qa-db-ja.com

テーブルの削除とテーブルの切り捨ての違いは?

レポートロールアップの一部として構築するテーブルがいくつかあります。後でそれらは必要ありません。誰かがそれがより速くなるのでそれらを切り捨てると述べました。

73
Brian G

テーブルからレコードを削除すると、すべての削除が記録され、削除されたレコードに対して削除トリガーが実行されます。 Truncateは、各行を記録せずにテーブルを空にするより強力なコマンドです。 SQL Serverでは、各行の外部キーをチェックする必要があるため、テーブルを参照する外部キーでテーブルを切り捨てることができません。

Truncateは通常、超高速で、一時テーブルからデータを消去するのに最適です。将来の使用のためにテーブルの構造を保持します。

実際にテーブルdefinitionsとデータを削除する場合は、単にテーブルを削除します。

詳細については、 このMSDN記事 を参照してください

92
JoshL

DROP TABLEはテーブルを削除します。

TRUNCATE TABLEはそれを空にしますが、将来のデータのためにその構造を残します。

82
ceejayoz

DROPとTRUNCは異なることを行います。

テーブルの切り捨て

個々の行の削除を記録せずに、テーブルからすべての行を削除します。 TRUNCATE TABLEは、WHERE句のないDELETEステートメントに似ています。ただし、TRUNCATE TABLEはより高速で、使用するシステムおよびトランザクションログリソースが少なくなります。

ドロップテーブル

1つ以上のテーブル定義と、それらのテーブルのすべてのデータ、インデックス、トリガー、制約、およびアクセス許可の仕様を削除します。

速度に関する限り、その差は小さいはずです。とにかく、テーブル構造がまったく必要ない場合は、必ずDROPを使用してください。

25
daremon

DELETE TABLEとTRUNCATE TABLEの違いを意味すると思います。

ドロップテーブル

データベースからテーブルを削除します。

テーブルの削除

条件なしですべての行を削除します。トリガーと参照がある場合、これはすべての行で処理されます。また、インデックスがある場合は変更されます。

テーブルの切り捨て

行カウントをゼロに設定し、各行をログに記録しません。それは他の両方と同じくらい速いです。

20
Horcrux7

これらの答えはいずれも、これら2つの操作に関する重要な違いを指摘していません。ドロップテーブルは、ロールバックできる操作です。 ただし、切り捨てはロールバックできません ['TRUNCATE TABLE'もロールバックできます]。この方法では、非常に大きなテーブルの削除は、行が多い場合、非常に高価になる可能性があります。なぜなら、行をロールバックすることになった場合、すべての行を一時スペースに記録する必要があるためです。

通常、大きなテーブルを削除する場合は、切り捨ててから削除します。この方法では、データは記録なしでnixされ、テーブルをドロップできます。データを記録する必要がないため、そのドロップは非常に安価です。

ただし、truncateはデータを削除するだけでテーブルを残しますが、実際にはdropはデータとテーブル自体を削除します。 (外部キーがそのようなアクションを排除しないと仮定)

10
Nathan Feger

ドロップテーブル

DROP TABLE [table_name];

DROPコマンドは、データベースからテーブルを削除するために使用されます。これはDDLコマンドです。テーブルのすべての行、インデックス、特権も削除されます。 DROP操作はロールバックできません。

テーブルの削除

DELETE FROM [table_name]
WHERE [condition];

DELETE FROM [table_name];

DELETEコマンドはDMLコマンドです。 WHERE句で指定された条件に基づいて、テーブルからすべての行または一部の行を削除するために使用できます。行ロックを使用して実行され、テーブル内の各行は削除のためにロックされます。トランザクションログを保持するため、TRUNCATEよりも低速です。 DELETE操作はロールバックできます。

TRUNCATEテーブル

TRUNCATE TABLE [table_name];

TRUNCATEコマンドは、テーブルからすべての行を削除します。各行の削除は記録されず、代わりにテーブルのデータページの割り当て解除が記録されるため、DELETEよりも高速になります。テーブルロックを使用して実行され、すべてのレコードを削除するためにテーブル全体がロックされます。これはDDLコマンドです。 TRUNCATE操作はロールバックできません。

4
Optimizer

TRUNCATE TABLEは、古いインデックスとその他すべてを保持します。 DROP TABLEは明らかにテーブルを取り除き、後で再作成する必要があります。

4
Kevin Fairchild

TRUNCATE TableAの代わりにTableAを削除しますか?よくある誤解は、同じことをしているということです。そうではありません。実際、2つの間に多くの違いがあります。

DELETEは、行ごとに記録される操作です。これは、各行の削除がログに記録され、物理的に削除されることを意味します。

外部キーまたはその他の制約をそのままにしておきながら、制約に違反しない行を削除できます。

TRUNCATEもログに記録された操作ですが、方法は異なります。 TRUNCATEは、データが存在するデータページの割り当て解除を記録します。データページの割り当て解除は、データ行がデータページにまだ実際に存在するが、再利用のためにエクステントが空としてマークされていることを意味します。これが、TRUNCATEをDELETEで実行するより高速な操作にする理由です。

外部キー制約を持つテーブルを切り捨てることはできません。制約を削除し、テーブルを切り捨てて、制約を再適用する必要があります。

TRUNCATEは、ID列をデフォルトのシード値にリセットします。

3
Raja

ドロップはテーブルを完全に削除し、定義も削除します。 Truncateはテーブルを空にしますが、定義を削除しません。

3
DMKing

テーブルを切り捨てると、テーブルが空になります。テーブルを削除すると、完全に削除されます。どちらかが高速になりますが、ドロップする方が高速になる可能性があります(データベースエンジンによって異なります)。

不要になった場合は、スキーマを乱雑にしないようにドロップしてください。

3
Dan Udey

TRUNCATE TABLEは、WHERE句のないDELETEステートメントと機能的に同じです。どちらもテーブル内のすべての行を削除します。ただし、TRUNCATE TABLEはDELETEよりも高速で、使用するシステムおよびトランザクションログリソースが少なくなります。

DELETEステートメントは、一度に1行ずつ削除し、削除された各行のトランザクションログにエントリを記録します。 TRUNCATE TABLEは、テーブルのデータを保存するために使用されるデータページの割り当てを解除してデータを削除し、ページの割り当て解除のみがトランザクションログに記録されます。

TRUNCATE TABLEはテーブルからすべての行を削除しますが、テーブル構造とその列、制約、インデックスなどは残ります。新しい行のIDが使用するカウンターは、列のシードにリセットされます。 IDカウンターを保持する場合は、代わりにDELETEを使用します。テーブル定義とそのデータを削除する場合は、DROP TABLEステートメントを使用します。

FOREIGN KEY制約によって参照されるテーブルでTRUNCATE TABLEを使用することはできません。代わりに、WHERE句なしでDELETEステートメントを使用します。 TRUNCATE TABLEはログに記録されないため、トリガーをアクティブにできません。

TRUNCATE TABLEは、イン​​デックス付きビューに参加しているテーブルでは使用できません。

から http://msdn.Microsoft.com/en-us/library/aa260621(SQL.80).aspx

2
Ricardo C

上記のいずれかのステートメントを修正しました...「切り捨てはロールバックできません」

切り捨てはロールバックできます。外部キー参照がある場合など、テーブルの切り捨てまたは削除ができない場合があります。毎月のレポートなどのタスクの場合、必要がなくなったらテーブルを削除するでしょう。このロールアップレポートをより頻繁に実行している場合は、代わりにテーブルを保持し、truncateを使用するでしょう。

これが役立つことを願っています、あなたが役に立つと思うべきいくつかのより多くの情報があります...

詳細については、次の記事を参照してください。 http://sqlblog.com/blogs/denis_gobo/archive/2007/06/13/1458.aspx

また、削除と切り捨ての詳細については、この記事を参照してください: http://www.sql-server-performance.com/faq/delete_truncate_difference_p1.aspx

ありがとう!ジェフ

2
Jeff

truncateは、テーブル自体ではなく、すべての行を削除します。これは、基本的にwhere句なしで削除するのと同じですが、通常は高速です。

2
mmaibaum

標準SQLでは、DROPテーブルはテーブルとテーブルスキーマを削除します-TRUNCATEはすべての行を削除します。

2
hangy

ここでの回答は質問に一致しますが、あなたが尋ねなかった質問に答えます。 「切り捨てまたは削除を使用する必要がありますか?」テーブルからすべての行を削除する場合は、はるかに高速であるため、通常は切り捨てます。なぜずっと速いのですか?少なくともOracleの場合、 最高水準点 をリセットします。これは基本的にデータの逆参照であり、dbがそれを他の何かに再利用できるようにします。

1
Dan Coates

削除と切り捨て

  1. DELETEステートメントは、一度に1行ずつ削除し、削除された各行のトランザクションログにエントリを記録します。 TRUNCATE TABLEは、テーブルデータの保存に使用されるデータページの割り当てを解除してデータを削除し、ページの割り当て解除のみをトランザクションログに記録します。
  2. WHEREDELETE句を使用できますが、TRUNCATEでは使用できません
  3. DELETEステートメントが行ロックを使用して実行されると、テーブル内の各行は削除のためにロックされます。 TRUNCATE TABLEは常にテーブルとページをロックしますが、各行はロックしません
  4. DELETEステートメントが実行された後、テーブルに空のページが含まれることがあります。削除操作でテーブルロックを使用しない場合、テーブル(ヒープ)には多くの空のページが含まれます。インデックスの場合、削除操作では空のページが残ることがありますが、これらは
    バックグラウンドクリーンアッププロセスにより、ページの割り当てが迅速に解除されます
  5. TRUNCATE TABLEはテーブルからすべての行を削除しますが、テーブル構造とその列、制約、インデックスなどは残ります
  6. DELETEステートメントはRESEED ID列ではなく、TRUNCATEステートメントRESEEDSIDENTITY
  7. 次のテーブルでTRUNCATE TABLEを使用することはできません。
    1. FOREIGN KEY制約によって参照されます。 (自分自身を参照する外部キーを持つテーブルを切り捨てることができます。)
    2. インデックス付きビューに参加します。
    3. トランザクションレプリケーションまたはマージレプリケーションを使用して公開されている
  8. TRUNCATE TABLEは、操作が個々の行の削除を記録しないため、トリガーをアクティブにできません
1
Sasikiran

ステートメントの削除

Deleteステートメントはテーブルの行を削除し、テーブルから削除された行数を返します。このステートメントでは、where句を使用してテーブルからデータを削除します。

  • レコードを1つずつ削除するため、DeleteステートメントはTruncateステートメントよりも遅い

ステートメントの切り捨て

Truncateステートメントテーブルからすべての行を削除または削除しました。

  • テーブルからすべてのレコードを削除したため、Deleteステートメントよりも高速です。
  • テーブルから削除された行の数を返さない切り捨てステートメント

ドロップステートメント

削除ステートメントは、すべてのレコードとテーブルの構造を削除しました

1
Zubair Saif

ドロップテーブル全体とそのすべての構造をドロップします

truncateテーブルからすべての行を削除します。削除とは異なり、行のインデックスも削除します。

0
ZIA

削除

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

切り捨て

TRUNCATEは、テーブルからすべての行を削除します。操作をロールバックすることはできません...そのため、TRUCATEはより高速で、DELETEほど多くの取り消しスペースを使用しません。

From: http://www.orafaq.com/faq/difference_between_truncate_delete_and_drop_commands

0
Mythili