違いは何TRUNCATE
とDELETE
SQLでは?
回答がプラットフォーム固有の場合は、それを示してください。
違いは何TRUNCATE
とDELETE
SQLでは?
回答がプラットフォーム固有の場合は、それを示してください。
回答:
ここに違いのリストがあります。オラクル固有の機能を強調しましたが、コミュニティが他のベンダー固有の違いを追加できることを願っています。ほとんどのベンダーに共通する違いは、見出しのすぐ下にあり、違いは以下で強調表示されています。
テーブルからすべての行をすばやく削除する必要があり、本当に削除したいと確信していて、テーブルに対する外部キーがない場合、TRUNCATEはおそらくDELETEよりも高速になります。 。
以下に詳述するように、システム固有のさまざまな問題を考慮する必要があります。
削除はDML、切り捨てはDDL(DDLとDMLとは何ですか?)
ベンダーにより変動
SQLサーバー
切り捨てはロールバックできます。
PostgreSQL
切り捨てはロールバックできます。
オラクル
TRUNCATEはDDLであるため、ステートメント実行の前と後の2つのコミットが含まれます。したがって、truncateをロールバックすることはできず、truncateプロセスでの障害により、いずれにしてもコミットが発行されます。
ただし、以下のフラッシュバックを参照してください。
削除してもスペースは回復しませんが、切り捨てるとスペースが回復します
オラクル
REUSE STORAGE句を使用する場合、データセグメントの割り当ては解除されません。これは、テーブルにデータを再ロードする場合、効率がわずかに向上する可能性があります。最高水位標がリセットされます。
Deleteを使用して、すべての行または行のサブセットのみを削除できます。Truncateはすべての行を削除します。
オラクル
テーブルがパーティション分割されている場合、個々のパーティションを個別に切り捨てることができるため、テーブルのすべてのデータを部分的に削除できます。
削除は、テーブルおよびクラスター内のテーブルに適用できます。Truncateは、テーブルまたはクラスター全体にのみ適用されます。(Oracle固有の場合があります)
オラクル
削除はデータオブジェクトIDに影響を与えませんが、テーブルの作成以降、テーブルに対する挿入がない場合を除いて、truncate は新しいデータオブジェクトIDを割り当てます。 。
フラッシュバックは削除全体で機能しますが、切り捨てにより、操作前の状態にフラッシュバックできなくなります。
ただし、11gR2からは、FLASHBACK ARCHIVE機能でこれが可能になります(Express Editionを除く)。
OracleでのFLASHBACKの使用 http://docs.oracle.com/cd/E11882_01/appdev.112/e41502/adfns_flashback.htm#ADFNS638
変数
オラクル
テーブルでの削除は別のユーザーまたはロールに付与できますが、DROP ANY TABLE付与を使用せずに切り捨てることはできません。
削除は、少量のやり直しと大量の取り消しを生成します。Truncateはそれぞれの生成量を無視できます。
オラクル
切り捨て操作により、使用できないインデックスが再び使用可能になります。削除はしません。
有効な外部キーがテーブルを参照する場合、切り捨ては適用できません。削除による処理は、外部キーの構成によって異なります。
オラクル
Truncateは排他的なテーブルロックを必要とし、deleteは共有テーブルロックを必要とします。したがって、テーブルロックを無効にすることは、テーブルでの切り捨て操作を防ぐ方法です。
DMLトリガーは切り捨てでは起動しません。
オラクル
DDLトリガーを使用できます。
オラクル
Truncateはデータベースリンクを介して発行できません。
SQLサーバー
TruncateはIDENTITY列タイプのシーケンスをリセットしますが、削除はリセットしません。
ほとんどの実装では、 DELETE
ステートメントはクライアントに削除された行を返すことができます。
たとえば、Oracle PL / SQLサブプログラムでは、次のことができます。
DELETE FROM employees_temp
WHERE employee_id = 299
RETURNING first_name,
last_name
INTO emp_first_name,
emp_last_name;
切り捨てと削除の違いを以下に示します。
+----------------------------------------+----------------------------------------------+
| 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) |
+----------------------------------------+----------------------------------------------+
落とす
DROPコマンドは、データベースからテーブルを削除します。テーブルのすべての行、インデックス、特権も削除されます。DMLトリガーは発生しません。操作はロールバックできません。
切り捨て
TRUNCATEは、テーブルからすべての行を削除します。操作はロールバックできず、トリガーは発生しません。そのため、TRUNCATEの方が高速で、DELETEほど多くの取り消しスペースを使用しません。切り捨て時にテーブルレベルのロックが追加されます。
削除
DELETEコマンドは、テーブルから行を削除するために使用されます。WHERE句は、一部の行のみを削除するために使用できます。WHERE条件が指定されていない場合、すべての行が削除されます。DELETE操作を実行した後、トランザクションをCOMMITまたはROLLBACKして、変更を永続的にするか、元に戻す必要があります。この操作により、テーブルのすべてのDELETEトリガーが起動することに注意してください。削除すると、行レベルのロックが追加されます。
送信元:http : //www.orafaq.com/faq/difference_between_truncate_delete_and_drop_commands
私が追加しなければならないすべての良い答え:
以来TRUNCATE TABLE
DDL(あるデータDefination言語)ではなく、DML(データ操作のlangauge)コマンド、Delete Triggers
実行しないでください。
SQL Serverでの削除とトランケートの概要の
完全な記事については、次のリンクにアクセスしてください。http://codaffection.com/sql-server-article/delete-vs-truncate-in-sql-server/
dotnet mob記事からの抜粋:SQL ServerでのVs Truncateの削除
SQL ServerまたはMySQLでは、自動インクリメントのPKがある場合、truncateはカウンターをリセットします。
DBCC CHECKIDENT (table_name, RESEED, 1)
「切り捨ては何も記録しません」は正しいです。私はさらに行きます:
トランケートはトランザクションのコンテキストでは実行されません。
削除よりも切り捨ての速度の利点は明らかです。その利点は、状況に応じて、些細なものから巨大なものまでさまざまです。
ただし、切り詰めによって参照整合性が意図せず壊れ、他の制約に違反することもありました。トランザクションなしでデータを変更することによって得られる力は、ネットなしで綱渡りをするときに継承する責任とバランスを取る必要があります。
TRUNCATE
はDDLステートメントDELETE
ですが、DMLステートメントです。2つの違いは次のとおりです。
以下のようTRUNCATE
DDL(あるデータ定義言語)文でそれは永久的な変更を加えるためにコミットする必要はありません。そして、これが、truncateによって削除された行をロールバックできなかった理由です。一方DELETE
、DML(データ操作言語)ステートメントは、その効果を永続的にするために明示的なコミットを必要とします。
TRUNCATE
常にテーブルからすべての行を削除し、テーブルを空にしてテーブル構造をそのままにしますDELETE
が、where句を使用すると条件付きで削除される場合があります。
TRUNCATE TABLE
ステートメントによって削除された行は復元できず、TRUNCATE
ステートメントでwhere句を指定できません。
TRUNCATE
ステートメントは、DELETE
ステートメントの削除トリガーではなくトリガーを起動しません
これは、トピックに関連する非常に優れたリンクです。
切り捨て
TRUNCATE SQLクエリは、個々の行の削除をログに記録せずに、テーブルからすべての行を削除します。
削除
DELETEキューを実行するには、ターゲットテーブルに対する削除権限が必要です。DELETEでWHERE句を使用する必要がある場合は、選択権限も必要です。
誤って削除/切り捨てを使用してテーブルからすべてのデータを削除した場合。コミットされたトランザクションをロールバックできます。最後のバックアップを復元し、削除/切り捨てが発生する直前までトランザクションログを実行します。
データベースで作業している間、それらの違いを知らずに削除と切り捨てを使用しています。この記事では、SQLでの削除と切り捨ての違いについて説明します。
削除:
- 削除はDMLコマンドです。
- Deleteステートメントは行ロックを使用して実行され、テーブル内の各行は削除のためにロックされます。
- where句でフィルターを指定できます。
- 条件が存在する場合、指定されたデータを削除します。
- 操作は個別にログに記録されるため、アクティビティをトリガーとして削除します。
- ログを保持するため、Truncateよりも遅い
切り捨て
- TruncateはDDLコマンドです。
- テーブルを切り捨てると、テーブルとページは常にロックされますが、各行はロックされません。すべてのデータが削除されるためです。
- Where条件は使用できません。
- すべてのデータを削除します。
- この操作では個々の行の削除がログに記録されないため、テーブルをトランケートしてもトリガーをアクティブにできません。
- ログを保持しないため、パフォーマンスが向上します。
注:トランザクションで使用すると、削除と切り捨ての両方をロールバックできます。トランザクションが完了した場合は、コミットされたことを意味します。Truncateコマンドをロールバックすることはできませんが、ログファイルから削除コマンドをロールバックすることは可能です。
切り詰めようとしているテーブルを参照している外部キー制約がある場合、参照しているテーブルにデータがない場合でも、これは機能しません。これは、外部キーのチェックがDMLではなくDDLで行われるためです。これは、テーブルへの外部キー制約を一時的に無効にすることで回避できます。
テーブルの削除はログに記録された操作です。そのため、各行の削除がトランザクションログに記録されるため、処理が遅くなります。テーブルを切り捨てると、テーブル内のすべての行も削除されますが、各行の削除はログに記録されず、テーブルのデータページの割り当て解除がログに記録されるため、処理が速くなります。
〜誤って削除/切り捨てを使用してテーブルからすべてのデータを削除した場合。コミットされたトランザクションをロールバックできます。最後のバックアップを復元し、削除/切り捨てが発生する直前までトランザクションログを実行します。
SQL Server 2005では、切り捨てをロールバックできると思います
削除
DELETEコマンドは、テーブルから行を削除するために使用されます。WHERE句は、一部の行のみを削除するために使用できます。WHERE条件が指定されていない場合、すべての行が削除されます。DELETE操作を実行した後、トランザクションをCOMMITまたはROLLBACKして、変更を永続的にするか、元に戻す必要があります。この操作により、テーブルのすべてのDELETEトリガーが起動することに注意してください。
切り捨て
TRUNCATEは、テーブルからすべての行を削除します。操作はロールバックできず、トリガーは発生しません。そのため、TRUCATEの方が高速で、DELETEほど多くの取り消しスペースを使用しません。
落とす
DROPコマンドは、データベースからテーブルを削除します。テーブルのすべての行、インデックス、特権も削除されます。DMLトリガーは発生しません。操作はロールバックできません。
DROPとTRUNCATEはDDLコマンドですが、DELETEはDMLコマンドです。したがって、DELETE操作はロールバック(元に戻す)できますが、DROPおよびTRUNCATE操作はロールバックできません。
送信元:http : //www.orafaq.com/faq/difference_between_truncate_delete_and_drop_commands
トランザクションにラップされている場合、TRUNCATEをロールバックできます。
以下の2つのリファレンスを参照して、自分でテストしてください。
TRUNCATEとDELETEは、SQLインタビューで悪名高い質問の1つです。面接担当者に適切に説明してください。そうしないと、仕事にコストがかかる可能性があります。問題は、多くの人が気づいていないことです。そのため、YES Truncateをロールバックできると伝えた場合、答えが間違っていると考えられる可能性が高くなります。
元の回答に対する小さな修正-削除もかなりの量のREDOを生成します(UNDO自体がREDOによって保護されているため)。これは、autotraceの出力から確認できます。
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
SQL ServerでのDELETEとTRUNCATEの違いに関する詳細な答えは次のとおりです
• データの削除 :最初に、両方を使用してテーブルから行を削除できます。
ただし、DELETEを使用して、テーブルからだけでなく、ビューから、またはプロバイダー機能の対象となるOPENROWSETまたはOPENQUERYの結果からも行を削除できます。
• FROM句:DELETEを使用すると、別のFROM句を使用して、別のテーブルの行に基づいて、1つのテーブル/ビュー/ rowset_function_limitedから行を削除することもできます。そのFROM句では、通常のJOIN条件を記述することもできます。実際には、SELECTをDELETEに置き換えて列名を削除することで、集計関数を含まないSELECTステートメントからDELETEステートメントを作成できます。
TRUNCATEを使用すると、それを行うことはできません。
• WHERE:TRUNCATEにはWHERE条件を含めることはできませんが、DELETEには含めることができます。つまり、TRUNCATEでは、特定の行または行の特定のグループを削除することはできません。TRUNCATE TABLEは、WHERE句のないDELETEステートメントに似ています。
• パフォーマンス:TRUNCATE TABLEの方が高速で、システムおよびトランザクションログリソースの使用量が少ない。そして、その理由の1つは、いずれかのステートメントで使用されるロックです。DELETEステートメントは行ロックを使用して実行され、テーブル内の各行は削除のためにロックされます。TRUNCATE TABLEは常にテーブルとページをロックしますが、各行はロックしません。
• トランザクションログ:DELETEステートメントは、一度に1行ずつ削除し、各行のトランザクションログに個別のエントリを作成します。
TRUNCATE TABLEは、テーブルデータの格納に使用されるデータページの割り当てを解除することでデータを削除し、ページの割り当て解除のみをトランザクションログに記録します。
• ページ:DELETEステートメントの実行後も、テーブルに空のページが含まれることがあります。TRUNCATEは、テーブルデータの格納に使用されるデータページの割り当てを解除することにより、データを削除します。
• トリガー:TRUNCATEはテーブルの削除トリガーをアクティブにしません。したがって、TRUNCATEを使用するときは十分に注意する必要があります。テーブルで削除トリガーが定義されている場合は、行が削除されたときに自動クリーンアップまたはロギングアクションを実行する場合、TRUNCATEを使用しないでください。
• ID列:テーブルにID列が含まれている場合、TRUNCATEを使用すると、その列のカウンターが列に定義されているシード値にリセットされます。シードが定義されていない場合、デフォルト値1が使用されます。DELETEはIDカウンターをリセットしません。したがって、IDカウンターを保持する場合は、代わりにDELETEを使用してください。
• レプリケーション:DELETEは、トランザクションレプリケーションまたはマージレプリケーションで使用されるテーブルに対して使用できます。
TRUNCATEは、トランザクションレプリケーションまたはマージレプリケーションに関係するテーブルに対しては使用できません。
• ロールバック:DELETEステートメントはロールバックできます。
TRUNCATEは、TRANSACTIONブロックで囲まれ、セッションが閉じられていない場合は、ロールバックすることもできます。セッションを閉じると、TRUNCATEをロールバックできなくなります。
• 制限:DELETEステートメントは、トリガーに違反したり、FOREIGN KEY制約のある別のテーブルのデータによって参照されている行を削除しようとしたりすると失敗する可能性があります。DELETEが複数の行を削除し、削除された行のいずれかがトリガーまたは制約に違反している場合、ステートメントはキャンセルされ、エラーが返され、行は削除されません。
また、DELETEがViewに対して使用される場合、そのViewは更新可能なビューでなければなりません。インデックス付きビューで使用されているテーブルに対してTRUNCATEを使用することはできません。
TRUNCATEは、それ自体を参照する外部キーを持つテーブルを除いて、FOREIGN KEY制約によって参照されるテーブルに対して使用できません。
DECLARE @ai as bigint
SET @ai =IDENT_CURRENT('tablename')
TRUNCATE TABLE tablename
DBCC checkident('tablename', RESEED, @ai)
削除
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/
それが便利な大きな理由は、数百万行のテーブルのデータを更新する必要があるが、それを再構築したくない場合です。「削除*」は永久にかかりますが、トランケートのパフォーマンスへの影響は無視できます。
dblinkではDDLを実行できません。
truncateがSQL Serverに何も記録しないわけではありません。truncateは情報をログに記録しませんが、TRUNCATEを実行したテーブルのデータページの割り当て解除をログに記録します。
トランザクションを最初に定義すると、切り捨てられたレコードはロールバックされ、ロールバック後に切り捨てられたレコードを回復できます。ただし、切り捨てられたトランザクションをコミットした後、トランザクションログバックアップから切り捨てられたレコードを回復することはできません。
Truncateは、ここでロールバックすることもできます。
begin Tran
delete from Employee
select * from Employee
Rollback
select * from Employee
SQLでの切り捨てと削除は、テーブルからデータを削除または削除するために使用される2つのコマンドです。本質的には非常に基本的ですが、両方のSQLコマンドは、使用する前に詳細に慣れるまで多くの問題を引き起こす可能性があります。削除する必要のあるデータが多すぎてログセグメントが十分でない場合、コマンドの選択を誤ると、プロセスが非常に遅くなるか、ログセグメントが破壊される可能性があります。そのため、SQLで切り捨てコマンドと削除コマンドをいつ使用するかを知ることが重要ですが、これらを使用する前に、TruncateとDeleteの違いに注意し、それらに基づいて、DELETEが削除のためのより良いオプションである場合を見つけることができるはずです。テーブルをパージするには、データまたはTRUNCATEを使用する必要があります。
ここをクリックしてチェックを参照してください
Microsoft SQL Serverに固有のもう1つの違いは、ステートメントをdelete
使用output
して、どのレコードが削除されたかを追跡できることです。次に例を示します。
delete from [SomeTable]
output deleted.Id, deleted.Name
でこれを行うことはできませんtruncate
。