ドロップテーブルとトランケートテーブルの違いは?


80

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



テーブルを切り捨てても、MySQLはハードディスクのスペースを解放しません。ストレージを元に戻したい場合は、テーブルを切り捨てずに削除する必要があります。
エミリオニコラス2014

回答:


102

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

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

データだけでなくテーブル定義も実際に削除したい場合は、テーブルを削除するだけです。

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


4
また、テーブルを切り捨てると、IDシードがリセットされます。これは、テーブルを切り捨ててデータを挿入し、毎回ID値がどうなるかを知ることができるため、テストに役立ちます。テーブル内のすべてのデータを削除した場合は、これを行うことができます。
ジム


87

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

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


4
男、あなたが知っているこれよりもはるかに多くのものがあります;)
David Aldridge

21
これが主な違いです。
ceejayoz 2008

26

DROPとTRUNCは異なることをします:

切り捨てテーブル

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

ドロップテーブル

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

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


20

DELETETABLEとTRUNCATETABLEの違いを意味していると思います。

ドロップテーブル

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

テーブルを削除

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

切り捨てテーブル

行数をゼロに設定し、各行をログに記録しません。それは他の両方よりもはるかに速いこと。


4
set the row count zero実際には、ID値を初期IDシード値に戻します。
Filip De Vos 2011年

10

これらの回答のいずれも、これら2つの操作に関する重要な違いを指摘していません。ドロップテーブルは、ロールバックできる操作です。 ただし、切り捨てはロールバックできません['TRUNCATETABLE'もロールバックできます]。このように、非常に大きなテーブルをドロップすると、行が多い場合に非常にコストがかかる可能性があります。これは、ロールバックする場合に備えて、すべてのテーブルを一時的なスペースに記録する必要があるためです。

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

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


2
これは完全には正しくありません。TRUNCATEは、「トランザクションログの復元」の意味ではなく、BEGIN TRANSACTION、TRUNCATE TABLE、ROLLBACKの意味でロールバックできます。ページの割り当て解除をログに記録します。
Mark Sowul 2011

1
-1DROPは基本的にTRUNCATE、システムテーブルからテーブルメタデータが削除されるだけです。ここでこの質問を参照してください
マーティンスミス

5

ドロップテーブル

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操作はロールバックできません。


これは正しくありません。Truncate andDropはロールバックできます。CREATE TABLE dbo.TestTruncate(ID INT)INSERT INTO dbo.TestTruncate(ID)VALUES(1)INSERT INTO dbo.TestTruncate(ID)VALUES(2)INSERT INTO dbo.TestTruncate(ID)VALUES(3)BEGIN TRAN TRUNCATE TABLE dbo dbo.TestTruncate DROP TABLE dbo.TestTruncate FROM .TestTruncate DROP TABLE dbo.TestTruncate ROLLBACK SELECT *
InbetweenWeekends

4

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


3

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


3

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

不要になった場合は、スキーマが乱雑にならないように削除してください。


3

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

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

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

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

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

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


「各行の削除はログに記録され、物理的に削除されます」。それが正しいと思いますか?MSDNのブログは、彼らはすぐに削除されていないことを言います。これがPostgresの仕組みでもあります。
Brad Koch

2

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


トランザクションをログに記録しないため、切り捨てる方が高速です(私は信じています)。そのため、削除の場合のように切り捨てからロールバックすることはできません。
Steven Murawski

2

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

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

これがお役に立てば幸いです。役立つ情報をいくつかご紹介します...

詳細については、次の記事を参照してください: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

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

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

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

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

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

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


2

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


1

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


1

削除と切り捨て

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

1

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

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


1

ステートメントを削除

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

  • 削除ステートメントは、レコードを1つずつ削除するため、切り捨てステートメントよりも低速です。

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

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

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

ドロップステートメント

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


0

削除

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

切り捨てる

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.