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