(Я пробовал это в MySql)
Я считаю, что они семантически эквивалентны. Почему бы не выявить этот тривиальный случай и не ускорить его?
(Я пробовал это в MySql)
Я считаю, что они семантически эквивалентны. Почему бы не выявить этот тривиальный случай и не ускорить его?
таблицу truncate нельзя откатить, это все равно что отбрасывать и воссоздавать таблицу.
... просто чтобы добавить деталей.
Вызов оператора DELETE указывает ядру базы данных создать журнал транзакций для всех удаленных записей. В случае, если удаление было выполнено по ошибке, вы можете восстановить свои записи.
Вызов оператора TRUNCATE - это сплошное «все или ничего», которое удаляет все записи без журнала транзакций для восстановления. Это определенно быстрее, но это следует делать только тогда, когда вы уверены, что вам не нужны никакие записи, которые вы собираетесь удалить.
Удалить из таблицы удаляет каждую строку по одной и добавляет запись в журнал транзакций, чтобы можно было выполнить откат операции. Время, необходимое для удаления, также пропорционально количеству индексов в таблице и наличию каких-либо ограничений внешнего ключа (для innodb).
Усечение эффективно удаляет таблицу и воссоздает ее и не может быть выполнено в рамках транзакции. Поэтому требуется меньше операций и выполняется быстро. Truncate также не использует никаких триггеров удаления.
Точные сведения о том, почему это быстрее в 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.
Для MySql 5, использующего InnoDb в качестве механизма хранения, TRUNCATE действует так же, как DELETE без предложения WHERE: т.е. для больших таблиц требуется время, потому что он удаляет строки одну за другой. Это изменилось в версии 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:
Для таблицы InnoDB до версии 5.0.3 InnoDB обрабатывает TRUNCATE TABLE, удаляя строки одну за другой. Начиная с MySQL 5.0.3, удаление строки за строкой используется, только если есть какие-либо ограничения FOREIGN KEY, которые ссылаются на таблицу. Если ограничений FOREIGN KEY нет, InnoDB выполняет быстрое усечение, удаляя исходную таблицу и создавая пустую с тем же определением, что намного быстрее, чем удаление строк по одной.
Усечение находится на уровне таблицы, а удаление - на уровне строки. Если вы переведете это в sql с другим синтаксисом, усечение будет таким:
DELETE * FROM table
таким образом удаляя все строки сразу, а инструкция DELETE (в PHPMyAdmin) выглядит так:
DELETE * FROM table WHERE id = 1
DELETE * FROM table WHERE id = 2
Пока стол не опустеет. Каждый запрос занимает количество (милли) секунд, что в сумме занимает больше времени, чем усечение.