の違いについて教えてくださいQUICKは、削除アプリケーション
質問
の違いについて教えてください TRUNCATE
や DELETE
アプリケーション?
ご回答はプラットフォームに固有でください。
解決
ここに違いのリストがあります。 Oracle固有の機能を強調しましたが、コミュニティが他のベンダーの特定の違いを追加できることを願っています。ほとんどのベンダーに共通する違いは、見出しのすぐ下にあります。違いは以下で強調表示されます。
一般的な概要
テーブルからすべての行をすばやく削除し、それを実行することが本当に確実で、テーブルに対する外部キーがない場合、TRUNCATEはおそらくより高速になりますDELETEよりも。
以下で詳述するように、さまざまなシステム固有の問題を考慮する必要があります。
ステートメントタイプ
削除はDML、切り捨てはDDL( DDLおよびDMLとは)
コミットおよびロールバック
ベンダーによって可変
SQL * Server
切り捨てはロールバックできます。
PostgreSQL
切り捨てはロールバックできます。
Oracle
TRUNCATEはDDLであるため、ステートメントの実行前と実行後の2つのコミットが含まれます。したがって、切り捨てをロールバックすることはできず、切り捨てプロセスの失敗はいずれにしてもコミットを発行します。
ただし、以下のフラッシュバックを参照してください。
スペース再生
削除はスペースを回復しません、Truncateはスペースを回復します
Oracle
REUSE STORAGE句を使用する場合、データセグメントの割り当ては解除されません。これは、テーブルにデータをリロードする場合、わずかに効率的です。最高水準点がリセットされます。
行スコープ
Deleteは、すべての行または行のサブセットのみを削除するために使用できます。切り捨てはすべての行を削除します。
Oracle
テーブルがパーティション化されている場合、個々のパーティションを個別に切り捨てることができるため、テーブルのすべてのデータを部分的に削除できます。
オブジェクトタイプ
削除は、テーブルおよびクラスター内のテーブルに適用できます。切り捨ては、テーブルまたはクラスター全体にのみ適用されます。 (Oracle固有の場合があります)
データオブジェクトID
Oracle
削除はデータオブジェクトIDには影響しませんが、truncateは新しいデータオブジェクトIDを割り当てます。 テーブルに対する挿入は作成されていないため、ロールバックされた1つの挿入でも切り捨て時に割り当てられる新しいデータオブジェクトID。
フラッシュバック(Oracle)
フラッシュバックは削除をまたいで機能しますが、切り捨ては操作前の状態へのフラッシュバックを防ぎます。
ただし、11gR2以降では、Express Editionを除き、FLASHBACK ARCHIVE機能でこれが可能です
OracleでのFLASHBACKの使用 http://docs.oracle.com/cd/ E11882_01 / appdev.112 / e41502 / adfns_flashback.htm#ADFNS638
特権
変数
Oracle
削除は、テーブルで別のユーザーまたはロールに付与できますが、DROP ANY TABLE付与を使用せずに切り捨てを行うことはできません。
やり直し/元に戻す
削除は、少量のやり直しと大量の取り消しを生成します。切り捨ては、ごくわずかな量を生成します。
インデックス
Oracle
切り捨て操作により、使用できないインデックスが再び使用可能になります。削除はしません。
外部キー
有効な外部キーがテーブルを参照している場合、切り捨ては適用できません。削除の処理は、外部キーの構成に依存します。
テーブルのロック<
他のヒント
切り捨てと削除の違いは以下のとおりです。
+----------------------------------------+----------------------------------------------+
| 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は、テーブルからすべての行を削除します。操作はロールバックできず、トリガーは起動されません。そのため、TRUCATEはより高速で、DELETEほど多くのUNDOスペースを使用しません。
削除
DELETEコマンドは、テーブルから行を削除するために使用されます。 WHERE句を使用して、一部の行のみを削除できます。 WHERE条件が指定されていない場合、すべての行が削除されます。 DELETE操作を実行した後、トランザクションをCOMMITまたはROLLBACKして、変更を永続的にするか元に戻す必要があります。この操作により、テーブルのすべてのDELETEトリガーが起動することに注意してください。
差出人: http://www.orafaq.com/faq/difference_between_truncate_delete_and_drop_commands
SQLサーバーでの削除と切り捨ての概要
完全な記事については、次のリンクを参照してください。 http:// codaffection .com / sql-server-article / delete-vs-truncate-in-sql-server /
dotnet mobの記事から取得: Vs Truncateを削除SQL Serverで
SQL ServerまたはMySQLで、自動インクリメントのPKがある場合、truncateはカウンターをリセットします。
&quot; Truncateは何もログに記録しません&quot;正しい。さらに先に進みます:
トランケートは、トランザクションのコンテキストでは実行されません。
削除よりも切り捨ての方が速度が優れていることは明らかです。その利点は、状況に応じて些細なものから巨大なものまでさまざまです。
しかし、truncateが意図せずに参照整合性を壊し、他の制約に違反するのを見てきました。トランザクション外でデータを変更することで得られるパワーは、ネットなしで綱渡りをするときに引き継ぐ責任とバランスを取る必要があります。
はい、DELETEはより遅く、TRUNCATEはより高速です。どうして?
DELETEは、レコードの読み取り、制約のチェック、ブロックの更新、インデックスの更新、およびやり直し/取り消しの生成を行う必要があります。すべてには時間がかかります。
TRUNCATEは、データベース内のテーブル(最高水準点)とpoofのポインターを調整するだけです!データはなくなりました。
これはオラクル固有の、知る限りです。
TRUNCATE
はDDLステートメントで、 DELETE
はDMLステートメントです。 2つの違いは次のとおりです。
-
TRUNCATE
はDDLであるため(データ定義言語)ステートメントは、変更を永続的にするためにコミットを必要としません。これが、truncateによって削除された行をロールバックできなかった理由です。一方、DELETE
はDMLです(データ操作言語)したがって、ステートメントを有効にするには、明示的なコミットが必要です。 -
TRUNCATE
は常にテーブルからすべての行を削除し、テーブルを空のままにし、テーブル構造はそのままにしますが、DELETE
はwhere句を使用すると条件付きで削除できます。 -
TRUNCATE TABLE
ステートメントによって削除された行は復元できず、TRUNCATE
ステートメントでwhere句を指定できません。 -
TRUNCATE
ステートメントは、DELETE
ステートメントの削除トリガーではなく、トリガーを起動しません
ここは、トピックに関連する非常に優れたリンクです。
誤って削除/切り捨てを使用してテーブルからすべてのデータを削除した場合。コミットされたトランザクションをロールバックできます。最後のバックアップを復元し、Delete / Truncateが実行される直前までトランザクションログを実行します。
以下の関連情報は、ブログ投稿:
データベースでの作業中に、削除と切り捨てを使用しています それらの違いを知る。この記事では、 SqlのDeleteとTruncateの違い。
削除:
- DeleteはDMLコマンドです。
- 削除ステートメントは行ロックを使用して実行され、テーブル内の各行は削除のためにロックされます。
- where句でフィルターを指定できます。
- 条件が存在する場合、指定されたデータを削除します。
- 操作は個別に記録されるため、アクティビティをトリガーとして削除します。
- ログを保持するため、切り捨てより遅い
切り捨て
- TruncateはDDLコマンドです。
- テーブルの切り捨ては常にテーブルとページをロックしますが、各行はロックしません。すべてのデータを削除します。
- Where条件は使用できません。
- すべてのデータを削除します。
- テーブルの切り捨ては、操作が個々の行の削除を記録しないため、トリガーをアクティブにできません。
- ログを保持しないため、パフォーマンスが向上します。
注:DeleteとTruncateは両方とも一緒に使用するとロールバックできます トランザクション。トランザクションが完了すると、コミットされたという意味になります rollback Truncateコマンドですが、Deleteコマンドをロールバックできます 削除書き込みは、ログファイルから記録します 将来ログファイルからロールバックする必要がありました。
テーブルを参照する外部キー制約がある場合 切り捨てようとすると、参照元テーブルにない場合でも機能しません その中のデータ。これは、外部キーのチェックがDDLで行われるためです。 DMLではなく。これは一時的に無効にすることで回避できます テーブルへの外部キー制約。
テーブルの削除はログに記録された操作です。したがって、各行の削除は トランザクションログに記録されるため、処理が遅くなります。テーブルを切り捨てる また、テーブル内のすべての行を削除しますが、削除のログは記録しません 代わりに各行は、データページの割り当て解除を記録します より高速になります。
〜誤ってテーブルからすべてのデータを削除した場合 削除/切り捨て。コミットされたトランザクションをロールバックできます。復元する 最後のバックアップと削除/切り捨て時までのトランザクションログの実行 もうすぐです。
SQL Server 2005では、切り捨てをロールバックできると思います
トランザクションにラップされている場合、TRUNCATEはロールバックできます。
以下の2つのリファレンスを参照して、自分でテストしてください:-
TRUNCATEとDELETEは、SQLインタビュー中の悪名高い質問の1つです。インタビュアーに適切に説明しないと、仕事に費用がかかる可能性があります。問題は、多くの人が認識していないため、YES Truncateをロールバックできることを伝えると、答えを間違っていると見なす可能性が高いことです。
削除
DELETEコマンドは、テーブルから行を削除するために使用されます。 WHERE句を使用して、一部の行のみを削除できます。 WHERE条件が指定されていない場合、すべての行が削除されます。 DELETE操作を実行した後、トランザクションをCOMMITまたはROLLBACKして、変更を永続的にするか元に戻す必要があります。この操作により、テーブルのすべてのDELETEトリガーが起動することに注意してください。
切り捨て
TRUNCATEは、テーブルからすべての行を削除します。操作はロールバックできず、トリガーは起動されません。そのため、TRUCATEはより高速で、DELETEほど多くのUNDOスペースを使用しません。
ドロップ
DROPコマンドは、データベースからテーブルを削除します。すべてのテーブルの行、インデックス、特権も削除されます。 DMLトリガーは起動されません。操作をロールバックできません。
DROPおよびTRUNCATEはDDLコマンドですが、DELETEはDMLコマンドです。したがって、DELETE操作はロールバック(元に戻す)できますが、DROPおよびTRUNCATE操作はロールバックできません。
送信元: http://www.orafaq.com/faq/difference_between_truncate_delete_and_drop_commands
元の回答に対する小さな修正-削除はかなりの量のやり直しも生成します(やり直し自体がやり直しによって保護されているため)。これは自動トレース出力から見ることができます:
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サーバー
• データの削除 :一番最初の両方に使用できるから行を削除します。
でも削除を除去できることがわかり、さらだけでなくテーブルからも見または結果OPENROWSETはOPENQUERY対象プロバイダ。
• From条項 :と削除を削除することもでき列からテーブル/ビュー/rowset_function_limitedに基づく行から別のテーブルを使うから提供しています。そのfrom条項内で書くこともでき通常の参加条件です。実際に作成でき、DELETEステートメントかSELECTステートがほとんど含まない他の集計関数に置き換え選択し削除および除去カラム名になってしまいます
と切り詰めできない。
• 場所 :を切り詰めではないですが条件が削除できます。その手段と切り詰め削除できませんが特定の行または特定のグループ内に表示されません。丸テーブルのDELETEステートメントのない場所を提供しています。
• 性能 :TRUNCATE TABLEはより速く、利用の少ないシステムやトランザクションログ資源です。の一つの理由は、ロックを使うには記述です。のDELETEステートメントの実行を行ロック、各行はテーブルがロックされて削除します。丸テーブルもロックはテーブルのページでもいいですか。
• トランザクションログ :DELETEステートメントを削除し行時間がないとすることで、より多くのエントリにトランザクションログのためらいですか。
丸テーブルを削除し、そのデータによる登録を直接解除データのページの保存に用いられるテーブルデータの記録のページdeallocationsの取引ログです。
• ページ :した後、DELETEステートメントが実行され、テーブルだけを含む空のページ。切り詰めを削除し、そのデータによる登録を直接解除データのページの保存に用いられるテーブルデータです。
• トリガー :切り詰めても設定できませんのトリガを削除します。なうよう十分注意してくださいが切り詰め.一つには絶対に使用しないでください切り詰めれば削除をトリガで定義されているので、テーブルにはいくつかの自動清掃活動にはログイン時にアクションの行が削除されます。
• ティカラム :と切り詰めれば、テーブルを含むアイデンティティカラムには、カウンターこのコーナーをリセットのシード値を定義します。ていない場合種子の定義は、デフォルト値1が使用される。削除しないリセットのカウンタです。だしていきたいと考えているアカウンタの使用削除します。
• 複製 :削除できに対して使われているテーブルの使用に係る複製または併合ます。
が切り詰め使用できませんのテーブルに関わる取引の複製または併合ます。
• ロールバック :DELETEステートメントできます。
TRUNCATEき上げにより保護されていを同封の取引によりブロックでセッションが閉じられるわけではありません。一度セッションが閉鎖することはできませんのでRollback切り詰め.
• 制限 :のDELETEステートメントに失敗した場合に違反することになトリガーまたは削除を試みる行によって参照されるデータを別のテーブルの外部キー制約の場合は削除複数行を削除し、いずれの除去に違反する行トリガーまたは制約の声明が解除された場合、エラーが返され、行が削除されます。
場合には削除に対して使われていると見なければな更新可能。切り詰め使用できませんのテーブルの使用なデビュー。
切り詰め使用できませんのテーブルによって参照される外部キー制約がない限り、テーブルは外部キーを参照。
最大の違いは、削除はログに記録されない操作ですが、削除はログに記録される操作です。
単に、データベースがクラッシュした場合、truncateによって操作されたデータを回復することはできませんが、deleteを使用すると回復できることを意味します。
詳細こちら
DELETEステートメント:このコマンドは、where句で指定された条件に基づいてテーブルから行のみを削除するか、条件が指定されていない場合はテーブルからすべての行を削除します。ただし、テーブルを含むスペースは解放されません。
SQL DELETEステートメントの構文は次のとおりです。
DELETE FROM table_name [WHERE condition];
TRUNCATEステートメント:このコマンドは、テーブルからすべての行を削除し、テーブルを含むスペースを解放するために使用されます。
削除
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 /
2つの操作のもう1つの違いは、テーブルにID列が含まれている場合、TRUNCATEでその列のカウンターが1(または列に定義されたシード値に)リセットされることです。 DELETEにはこの影響はありません。
要するに、truncateは何もログに記録しません(非常に高速ですが、元に戻すことはできません)。一方、削除はログに記録されます(より大きなトランザクションの一部であり、ロールバックなど)。 devのテーブルに不要なデータがある場合、トランザクションログがいっぱいになるリスクを負わないため、通常は切り捨てることをお勧めします
これが便利な大きな理由は、数百万行のテーブルのデータを更新する必要があるが、再構築したくない場合です。 &quot;削除*&quot; Truncateのパフォーマンスへの影響は無視できますが、永遠にかかります。
dblinkでDDLを実行できません。
matthieuの投稿にコメントしたいのですが、まだ担当者がいません...
MySQLでは、自動インクリメントカウンターは切り捨てでリセットされますが、削除ではリセットされません。
truncateがSQL Serverに何も記録しないわけではありません。 truncateは情報を記録しませんが、TRUNCATEを起動したテーブルのデータページの割り当て解除を記録します。
開始時にトランザクションを定義すると、および切り捨てられたレコードはロールバックされ、ロールバック後に切り捨てられたレコードを回復できます。ただし、コミットされた切り捨てられたトランザクションの後、切り捨てられたレコードをトランザクションログバックアップから回復することはできません。
例では、ここで切り捨てをロールバックすることもできます
begin Tran
delete from Employee
select * from Employee
Rollback
select * from Employee
SQLの切り捨てと削除は、テーブルからデータを削除または削除するために使用される2つのコマンドです。本質的に非常に基本的ですが、両方のSqlコマンドは、使用する前に詳細に慣れるまで多くの問題を引き起こす可能性があります。 誤ったコマンドの選択は、非常に多くのデータを削除する必要があり、ログセグメントが十分でない場合、プロセスが非常に遅くなるか、ログセグメントを爆破する可能性があります。そのため、SQLでtruncateおよびdeleteコマンドをいつ使用するかを知ることが重要ですが、これらを使用する前に、TruncateとDeleteの違いに注意する必要があります。データまたはTRUNCATEを使用してテーブルをパージする必要があります。
TRUNCATE TABLEステートメントを発行することにより、SQL Serverに、ロギングやトランザクション処理を行わずに、テーブル内のすべてのレコードを削除するよう指示します。
DELETEステートメントには、特定のレコードを削除するWHERE句を含めることができますが、TRUNCATEステートメントにはテーブル全体を消去する必要はありません。 重要なのは、DELETEステートメントは削除された日付を記録するのに対し、TRUNCATEステートメントは記録しないことです。
Microsoft SQL Serverに固有のもう1つの違いは、 delete
の場合です。 output
ステートメントを使用して、削除されたレコードを追跡できます。例:
delete from [SomeTable]
output deleted.Id, deleted.Name
truncate
でこれを行うことはできません。
Truncate コマンドは、テーブルの再初期化に使用されます。これは、テーブルのすべての行を削除するDDLコマンドです。 DELETE は、使用されるDMLコマンドです。ある条件に従って行または行セットを削除するには、条件が指定されていない場合、このコマンドはテーブルからすべての行を削除します。