テーブルの削除とテーブルの切り捨ての違いは?
-
02-07-2019 - |
質問
レポートロールアップの一部として作成するテーブルがいくつかあります。後でそれらは必要ありません。誰かがそれがより速くなるのでそれらを切り捨てると述べました。
解決
テーブルからレコードを削除すると、すべての削除が記録され、削除されたレコードに対して削除トリガーが実行されます。 Truncateは、各行を記録せずにテーブルを空にするより強力なコマンドです。 SQL Serverでは、各行の外部キーをチェックする必要があるため、テーブルを参照する外部キーでテーブルを切り捨てることができません。
Truncateは通常、超高速で、一時テーブルからデータを消去するのに最適です。将来の使用のためにテーブルの構造を保持します。
データだけでなくテーブル定義も実際に削除したい場合は、単にテーブルを削除してください。
詳細については、このMSDN記事を参照してください。
他のヒント
DROP TABLEはテーブルを削除します。
TRUNCATE TABLEはそれを空にしますが、将来のデータのためにその構造を残します。
DROPとTRUNCは異なることを行います:
TRUNCATE TABLE
すべての行をテーブルから削除します 個々の行の削除を記録します。 TRUNCATE TABLEは WHERE句のないDELETEステートメント。 ただし、TRUNCATE TABLEはより高速で、 より少ないシステムとトランザクションログを使用します リソース。
ドロップテーブル
1つ以上のテーブル定義を削除します すべてのデータ、インデックス、トリガー、 制約、および許可 それらのテーブルの仕様。
速度に関する限り、その差は小さいはずです。とにかく、テーブル構造がまったく必要ない場合は、DROPを使用してください。
DELETE TABLEとTRUNCATE TABLEの違いを意味すると思います。
ドロップテーブル
データベースからテーブルを削除します。
テーブルの削除
条件なしですべての行を削除します。トリガーと参照がある場合、これはすべての行で処理されます。また、インデックスがあれば変更されます。
テーブルの切り捨て
行カウントをゼロに設定し、各行をログに記録しません。他の両方よりもはるかに高速であること。
これらの回答のいずれも、これら2つの操作に関する重要な違いを指摘していません。ドロップテーブルは、ロールバックできる操作です。 ただし、truncateはロールバックできません ['TRUNCATE TABLE'もロールバックできます]。このように、非常に大きなテーブルの削除は、行が多い場合に非常にコストがかかる可能性があります。すべての行は、ロールバックすることになった場合に備えて一時スペースに記録する必要があるためです。
通常、大きなテーブルを削除する場合は、切り捨ててから削除します。この方法では、データは記録なしでnixされ、テーブルをドロップできます。データを記録する必要がないため、ドロップは非常に安価です。
truncateはデータを削除するだけでテーブルを残しますが、実際にはdropはデータとテーブル自体を削除することに注意することが重要です。 (外部キーがそのようなアクションを排除しないと仮定)
TRUNCATE TABLEは、古いインデックスとその他すべてを保持します。 DROP TABLEは明らかにテーブルを削除し、後で再作成する必要があります。
ドロップテーブル
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操作はロールバックできません。
Dropはテーブルを完全に削除し、定義も削除します。 Truncateはテーブルを空にしますが、定義を削除しません。
テーブルを切り捨てると、テーブルが空になります。テーブルを削除すると、完全に削除されます。どちらも高速ですが、ドロップする方が高速になる可能性があります(データベースエンジンによって異なります)。
不要になった場合は、スキーマを乱雑にしないようにドロップしてください。
TableAの代わりにTableAを削除しますか? よくある誤解は、同じことをしているということです。ない そう。実際、2つの間に多くの違いがあります。
DELETEは、行ごとに記録される操作です。これの意味は 各行の削除が記録され、物理的に削除されること。
外部キーまたはその他の制約をそのままにして、制約に違反しない行を削除できます。
TRUNCATEも記録された操作ですが、方法は異なります。 TRUNCATEは、データが存在するデータページの割り当て解除を記録します 存在します。データページの割り当て解除は、データが 行はまだデータページに実際に存在しますが、 エクステントは再利用のために空としてマークされています。これは何 TRUNCATEを実行してDELETEをより速く実行します。
外部キーを持つテーブルを切り捨てることはできません 制約。制約を削除し、TRUNCATEする必要があります テーブル、および制約を再適用します。
TRUNCATEは、ID列をデフォルトのシードにリセットします 値。
truncateは、テーブル自体ではなく、すべての行を削除します。基本的には、where句なしで削除するのと同じですが、通常は高速です。
上記のいずれかのステートメントを修正しました..." truncateをロールバックできません"
切り捨てはロールバックできます。外部キー参照がある場合など、テーブルの切り捨てや削除ができない場合があります。毎月のレポートなどのタスクの場合、必要がなくなったらテーブルを削除するでしょう。このロールアップレポートをより頻繁に行っていた場合は、代わりにテーブルを保持し、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
ありがとう! ジェフ
TRUNCATE TABLEは機能的に noを指定したDELETEステートメントと同一 WHERE句:両方ともすべての行を削除します テーブル。ただし、TRUNCATE TABLEは より速く、より少ないシステムを使用し、 DELETEよりもトランザクションログリソース。
DELETEステートメントは行1を削除します 一度にエントリを記録します 削除された各行のトランザクションログ。 TRUNCATE TABLEは次の方法でデータを削除します に使用されるデータページの割り当て解除 テーブルのデータを保存し、 ページの割り当て解除は トランザクションログ。
TRUNCATE TABLEはaからすべての行を削除します テーブル、ただしテーブル構造とその 列、制約、インデックスなど 残ります。によって使用されるカウンター 新しい行のアイデンティティはにリセットされます 列のシード。あなたがしたい場合は IDカウンターを保持し、使用する 代わりに削除します。削除したい場合 テーブル定義とそのデータ、使用 DROP TABLEステートメント。
TRUNCATE TABLEは使用できません 外部キーによって参照されるテーブル 制約;代わりに、DELETEを使用します WHERE句のないステートメント。 TRUNCATE TABLEはログに記録されないため、 トリガーをアクティブにすることはできません。
TRUNCATE TABLEは使用できません インデックスに参加しているテーブル 表示。
http://msdn.microsoft.comから/en-us/library/aa260621(SQL.80).aspx
SQL標準では、DROPテーブルはテーブルとテーブルスキーマを削除します-TRUNCATEはすべての行を削除します。
ここでの回答は質問と一致しますが、あなたが尋ねなかった質問に答えます。 "切り捨てまたは削除を使用しますか?"テーブルからすべての行を削除する場合は、はるかに高速であるため、通常は切り捨てます。なぜずっと速いのですか?少なくともOracleの場合、最高水準点。これは基本的にデータの逆参照であり、dbがそれを他の何かに再利用できるようにします。
DELETE VS TRUNCATE
-
DELETE
ステートメントは、一度に1行ずつ削除し、トランザクションのエントリを記録します 削除された各行のログ。TRUNCATE TABLE
は、データの割り当てを解除してデータを削除します テーブルデータの保存に使用されるページと、ページの割り当て解除のみを記録します。 トランザクションログ -
DELETE
ではWHERE
句を使用できますが、TRUNCATE
では使用できません - 行ロックを使用して
DELETE
ステートメントを実行すると、テーブル内の各行がロックされます 削除用。TRUNCATE TABLE
は常にテーブルとページをロックしますが、各行はロックしません -
DELETE
ステートメントが実行された後、テーブルに空のページを含めることができます。 削除操作はテーブルロックを使用しません。テーブル(ヒープ)には多くの空が含まれます。 ページ。インデックスの場合、削除操作によって空のページが残ることがありますが、これらは
バックグラウンドクリーンアッププロセスにより、ページの割り当てが迅速に解除されます -
TRUNCATE TABLE
は、テーブルからすべての行を削除しますが、テーブル構造とその列、 制約、インデックスなどが残ります -
DELETE
ステートメントはRESEED
ID列ではなく、TRUNCATE
ステートメントRESEEDS
IDENTITY
列 - 次のようなテーブルでは、
TRUNCATE TABLE
を使用できません。-
FOREIGN KEY
制約によって参照されています。 (テーブルを切り捨てることができます 自分自身を参照する外部キー。) - インデックス付きビューに参加します。
- トランザクションレプリケーションまたはマージレプリケーションを使用して公開されています
-
-
TRUNCATE TABLE
は、操作が個々のログを記録しないため、トリガーをアクティブにできません 行の削除
ステートメントの削除
Deleteステートメントはテーブル行を削除し、テーブルから削除された行数を返します。このステートメントでは、where句を使用してテーブルからデータを削除します
- レコードを1つずつ削除するため、DeleteステートメントはTruncateステートメントよりも低速です
ステートメントの切り捨て
Truncateステートメントテーブルからすべての行を削除または削除します。
- テーブルからすべてのレコードを削除したため、Deleteステートメントよりも高速です
- テーブルから削除された行数を返さない切り捨てステートメント
ドロップステートメント
Dropステートメントは、すべてのレコードとテーブルの構造を削除しました
削除
DELETEコマンドは、テーブルから行を削除するために使用されます。 WHERE句を使用して、一部の行のみを削除できます。 WHERE条件が指定されていない場合、すべての行が削除されます。 DELETE操作を実行した後、以下を行う必要があります トランザクションをCOMMITまたはROLLBACKして、変更を永続的にするか、元に戻します。
切り捨て
TRUNCATEは、テーブルからすべての行を削除します。操作をロールバックすることはできません...そのため、TRUCATEはより速く、DELETEと同じくらいの取り消しスペースを使用しません。
送信元: http://www.orafaq.com/faq/difference_between_truncate_delete_and_drop_commands
ドロップ テーブル全体とそのすべての構造を削除する
切り捨て テーブルからすべての行を削除します 削除とは異なり、行のインデックスも削除します