Small. Fast. Reliable.
Choose any three.
VACUUM

1. Синтаксис

vacuum-stmt:

VACUUM schema-name INTO filename

2. Описание

Команда VACUUM восстанавливает файл базы данных, повторно упаковывая его в минимальную сумму дискового пространства. Есть несколько причин, по которым приложение могло бы сделать это:

По умолчанию VACUUM воздействует на главную базу данных. Приложенные базы данных могут пропылесоситься, приложив соответствующее schema-name.

Предупреждение совместимости: способность пропылесосить приложенные базы данных была добавлена в version 3.15.0 (2016-10-14). Раньше schema-name было бы тихо проигнорировано, обрабатывалась только схема "main".

2.1. VACUUM с INTO

Если есть INTO, то оригинальный файл базы данных неизменен, и новая база данных создается в файле, названном аргументом пункта INTO. Аргумент это скалярное выражение, такое как буквальный текст. Новая база данных будет содержать то же самое логическое содержание как оригинальная база данных, полностью вакуумированная.

VACUUM с INTO это альтернатива backup API для создания резервных копий живой базы данных. Преимущество использования VACUUM INTO в том, что получающаяся резервная база данных минимальна в размере и следовательно сумма I/O файловой системы может быть уменьшена. Кроме того, все удаленное содержание очищено от резервной копии, не оставив издержек. С другой стороны, backup API использует меньше циклов CPU и может быть выполнен с приращением.

Имя файла в пункте INTO может быть произвольным SQL-выражением, которое оценивается к последовательности. Файл, названный пунктом INTO, не должен существовать или это должен быть пустой файл, иначе VACUUM INTO прервется с ошибкой.

Аргументом INTO может быть URI filename, если включены URI filename. URL filename доступны если какое-либо следующее утверждение верно:

VACUUM INTO транзакционная в том смысле, что произведенная выходная база данных это последовательный образ оригинальной базы данных. Однако, если VACUUM INTO прервана незапланированным закрытием, то произведенная выходная база данных могла бы быть неполной и поврежденной. Кроме того, SQLite не вызывает fsync() или FlushFileBuffers() на произведенной базе данных, чтобы гарантировать, что это достигло энергонезависимой памяти перед завершением.

3. Как работает VACUUM

VACUUM работает, копируя содержание базы данных во временный файл базы данных и затем переписывая оригинал содержанием временного файла. Переписывая оригинал, журнал обратной перемотки или журнал с упреждающей записью файл WAL используется, как это было бы для любой другой транзакции базы данных. Это означает это, когда база данных вакуумируется, дважды размер оригинального файла базы данных требуется в свободном пространстве на диске.

VACUUM INTO работает так же, за исключением того, что это использует файл, названный в пункте INTO вместо временной базы данных, и опускает шаг копирования почищенной базы данных назад поверх оригинальной базы данных.

VACUUM может изменить ROWID записей в любых таблицах, у которых нет явного INTEGER PRIMARY KEY.

VACUUM потерпит неудачу, если будет открытая транзакция на соединении с базой данных, которое пытается управлять VACUUM. Незавершенные SQL-операторы, как правило, считают транзакцию чтения открытой, таким образом, VACUUM мог бы потерпеть неудачу, если есть незавершенные SQL-операторы на той же самой связи. VACUUM (но не VACUUM INTO) является операцией записи и поэтому если другое соединение с базой данных держит блокировку, которая предотвращает запись, тогда VACUUM потерпит неудачу.

Альтернатива использованию команды VACUUM, чтобы восстановить пространство после удаления данных, это автовакуумный режим через auto_vacuum pragma. Когда auto_vacuum включен для базы данных, свободные страницы могут быть исправлены после удаления данных, заставив файл сжаться, не восстанавливая всю базу данных, используя VACUUM. Однако, использование auto_vacuum может привести к дополнительной фрагментации файла базы данных. auto_vacuum не уплотняет частично заполненные страницы базы данных, как VACUUM.