16

(MySqlでこれを試しました)

意味的には同等だと思います。この些細なケースを特定してスピードアップしてみませんか?

4

6 に答える 6

30

truncate table はロールバックできません。これは、テーブルを削除して再作成するようなものです。

于 2008-12-24T18:50:08.913 に答える
23

...詳細を追加するだけです。

DELETE ステートメントを呼び出すと、削除されたすべてのレコードのトランザクション ログを生成するようデータベース エンジンに指示されます。削除が誤って行われた場合は、記録を復元できます。

TRUNCATE ステートメントの呼び出しは、復元するトランザクション ログのないすべてのレコードを削除するブランケット "オール オア ナッシング" です。これは間違いなく高速ですが、削除するレコードがまったく必要ないことが確実な場合にのみ実行してください。

于 2008-12-24T18:52:29.690 に答える
9

テーブルから削除すると、各行が一度に 1 行ずつ削除され、操作をロールバックできるようにトランザクション ログにレコードが追加されます。削除にかかる時間は、テーブル上のインデックスの数、および外部キー制約 (innodb の場合) がある場合にも比例します。

Truncate はテーブルを効果的に削除して再作成するため、トランザクション内で実行することはできません。したがって、必要な操作が少なくなり、迅速に実行されます。Truncate は on delete トリガーも使用しません。

なぜこれが MySql の方が速いのかについての正確な詳細は、MySql のドキュメントにあります: http://dev.mysql.com/doc/refman/5.0/en/truncate-table.html

于 2008-12-24T18:53:50.747 に答える
6

あなたの質問は 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で試してみたら、結果を知りたいです.

于 2008-12-25T16:16:43.467 に答える
1

ストレージエンジンとして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つずつ削除するよりもはるかに高速です。」

于 2009-09-25T11:05:27.277 に答える
-1

切り捨てはテーブル レベルで行われ、削除は行レベルで行われます。これを別の構文で sql に変換すると、truncate は次のようになります。

DELETE * FROM table

したがって、すべての行を一度に削除しますが、DELETE ステートメント (PHPMyAdmin 内) は次のようになります。

DELETE * FROM table WHERE id = 1
DELETE * FROM table WHERE id = 2

テーブルが空になるまで。各クエリには (ミリ) 秒の時間がかかり、合計すると切り捨てよりも時間がかかります。

于 2013-08-14T09:50:10.830 に答える