Spec-Zone.ru › MariaDB

TRUNCATE TABLE

Синтаксис

TRUNCATE [TABLE] tbl_name
  [WAIT n | NOWAIT]

Описание

TRUNCATE TABLE полностью очищает таблицу. Требуется привилегия DROP. См. GRANT.

tbl_name также может быть указано в виде db_name.tbl_name (см. Квалификаторы идентификаторов).

Логически, TRUNCATE TABLE эквивалентно оператору DELETE, удаляющему все строки, но в некоторых обстоятельствах существуют практические различия.

TRUNCATE TABLE завершится ошибкой для InnoDB таблицы, если какие-либо ограничения внешнего ключа из других таблиц ссылаются на эту таблицу, возвращая ошибку:

ERROR 1701 (42000): Cannot truncate a table referenced in a foreign key constraint

Ограничения внешнего ключа между столбцами в одной таблице разрешены.

Для InnoDB таблицы, если нет FOREIGN KEY ограничений, InnoDB выполняет быстрое усечение, удаляя исходную таблицу и создавая пустую таблицу с тем же определением, что намного быстрее, чем удаление строк по одной. Счётчик AUTO_INCREMENT сбрасывается операцией TRUNCATE TABLE, независимо от наличия FOREIGN KEY ограничения.

Количество строк, затронутых операцией TRUNCATE TABLE, точно отображается только при сопоставлении с оператором DELETE.

Для других типов хранилищ TRUNCATE TABLE отличается от DELETE следующим образом:

  • Операции усечения удаляют и повторно создают таблицу, что намного быстрее, чем удаление строк по одной, особенно для больших таблиц.
  • Операции усечения вызывают неявную фиксацию.
  • Операции усечения не могут быть выполнены, если сессия удерживает активную блокировку таблицы.
  • Операции усечения не возвращают осмысленное значение количества удалённых строк. Обычно результат — «0 строк затронуто», что следует интерпретировать как «нет информации».
  • Пока файл формата таблицы tbl_name.frm валиден, таблицу можно пересоздать как пустую таблицу с TRUNCATE TABLE, даже если данные или индексные файлы повреждены.
  • Обработчик таблицы не запоминает последнее использованное значение AUTO_INCREMENT, а начинает отсчёт с начала. Это верно даже для MyISAM и InnoDB, которые обычно не повторно используют значения последовательности.
  • При использовании с разнесёнными таблицами TRUNCATE TABLE сохраняет разбиение, то есть данные и индексные файлы удаляются и повторно создаются, а файл определений разделов (.par) остается без изменений.
  • Так как усечение таблицы не использует DELETE, оператор TRUNCATE не вызывает триггеров ON DELETE.
  • TRUNCATE TABLE просто обнуляет значения в таблицах сводки Performance Schema до нуля или NULL, не удаляя строк.

Для целей двоичного протоколирования и репликации, TRUNCATE TABLE обрабатывается как DROP TABLE, после чего CREATE TABLE (DDL вместо DML).

TRUNCATE TABLE не работает со представлениями. В настоящее время TRUNCATE TABLE удаляет все исторические записи из системной таблицы с версиями.

WAIT/NOWAIT

Устанавливает тайм-аут ожидания блокировки. См. WAIT и NOWAIT.

Режим Oracle

Режим Oracle начиная с MariaDB 10.3 позволяет использовать необязательные ключевые слова REUSE STORAGE или DROP STORAGE.

TRUNCATE [TABLE] tbl_name [{DROP | REUSE} STORAGE] [WAIT n | NOWAIT]

Эти ключевые слова не оказывают влияния на операцию.

Производительность

TRUNCATE TABLE быстрее, чем DELETE, так как она удаляет и пересоздаёт таблицу.

С InnoDB, TRUNCATE TABLE медленнее, если innodb_file_per_table=ON установлено (по умолчанию). Это связано с тем, что TRUNCATE TABLE разрывает связь с файлом пространства имен, что может быть дорогостоящей операцией. См. MDEV-8069 для получения дополнительной информации.

Проблемы производительности с innodb_file_per_table=ON могут усугубляться в случаях, когда кэширование InnoDB буфера очень велико, и innodb_adaptive_hash_index=ON установлено. В этом случае использование DROP TABLE, после которого следует CREATE TABLE, вместо TRUNCATE TABLE может иметь лучшие показатели производительности. Установка innodb_adaptive_hash_index=OFF (по умолчанию ON до MariaDB 10.5) также может помочь. Только в MariaDB 10.2, начиная с MariaDB 10.2.19, эту производительность также можно улучшить, установив innodb_safe_truncate=OFF. См. MDEV-9459 для получения дополнительной информации.

Установка innodb_adaptive_hash_index=OFF также может улучшить производительность TRUNCATE TABLE в целом. См. MDEV-16796 для получения дополнительной информации.

См. также

  • Функция TRUNCATE
  • innodb_safe_truncate системная переменная
  • Режим Oracle с MariaDB 10.3
Содержимое, воспроизведенное на этом сайте, является собственностью соответствующих владельцев, и это содержание не проверяется предварительно компанией MariaDB. Мнения, информация и мнения, выраженные в этом содержании, не обязательно отражают точку зрения MariaDB или любой другой стороны.

© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/truncate-table/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API