(MySqlでこれを試しました)
意味的には同等だと思います。この些細なケースを特定してスピードアップしてみませんか?
truncate table はロールバックできません。これは、テーブルを削除して再作成するようなものです。
...詳細を追加するだけです。
DELETE ステートメントを呼び出すと、削除されたすべてのレコードのトランザクション ログを生成するようデータベース エンジンに指示されます。削除が誤って行われた場合は、記録を復元できます。
TRUNCATE ステートメントの呼び出しは、復元するトランザクション ログのないすべてのレコードを削除するブランケット "オール オア ナッシング" です。これは間違いなく高速ですが、削除するレコードがまったく必要ないことが確実な場合にのみ実行してください。
テーブルから削除すると、各行が一度に 1 行ずつ削除され、操作をロールバックできるようにトランザクション ログにレコードが追加されます。削除にかかる時間は、テーブル上のインデックスの数、および外部キー制約 (innodb の場合) がある場合にも比例します。
Truncate はテーブルを効果的に削除して再作成するため、トランザクション内で実行することはできません。したがって、必要な操作が少なくなり、迅速に実行されます。Truncate は on delete トリガーも使用しません。
なぜこれが MySql の方が速いのかについての正確な詳細は、MySql のドキュメントにあります: http://dev.mysql.com/doc/refman/5.0/en/truncate-table.html
あなたの質問は MySQL に関するものでした。私は製品としての MySQL についてほとんど何も知りませんが、SQL Server では TRUNCATE ステートメントをロールバックできることを追加すると思いました。自分で試してみてください
create table test1 (col1 int)
go
insert test1 values(3)
begin tran
truncate table test1
select * from test1
rollback tran
select * from test1
SQL Server では TRUNCATE がログに記録されますが、DELETE がログに記録されるような詳細な方法では記録されません。これは、最小ログ操作と呼ばれていると思います。事実上、データ ページにはまだデータが含まれていますが、そのエクステントは削除対象としてマークされています。データ ページがまだ存在する限り、切り捨てをロールバックできます。これが役に立てば幸いです。誰かがMySQLで試してみたら、結果を知りたいです.
ストレージエンジンとしてInnoDbを使用するMySql5の場合、TRUNCATEはWHERE句のないDELETEと同じように機能します。つまり、大きなテーブルの場合、行を1つずつ削除するため、時間がかかります。これはバージョン6.xで変更されています。
見る
http://dev.mysql.com/doc/refman/5.1/en/truncate-table.html
5.1情報(InnoDBを使用した行ごと)および
http://blogs.mysql.com/peterg/category/personal-opinion/
6.xでの変更について
この答えは、MySQLのドキュメントと明らかに矛盾しています。
「バージョン5.0.3より前のInnoDBテーブルの場合、InnoDBは行を1つずつ削除してTRUNCATE TABLEを処理します。MySQL5.0.3以降、行ごとの削除は、テーブルを参照するFOREIGNKEY制約がある場合にのみ使用されます。 FOREIGN KEY制約がない場合、InnoDBは元のテーブルを削除し、同じ定義で空のテーブルを作成することで高速な切り捨てを実行します。これは、行を1つずつ削除するよりもはるかに高速です。」
切り捨てはテーブル レベルで行われ、削除は行レベルで行われます。これを別の構文で sql に変換すると、truncate は次のようになります。
DELETE * FROM table
したがって、すべての行を一度に削除しますが、DELETE ステートメント (PHPMyAdmin 内) は次のようになります。
DELETE * FROM table WHERE id = 1
DELETE * FROM table WHERE id = 2
テーブルが空になるまで。各クエリには (ミリ) 秒の時間がかかり、合計すると切り捨てよりも時間がかかります。