Объяснение назначения функций очистки (vacuum) и автоматической очистки (autovacuum)
При обновлении строки каждое обновление состоит из операций вставки и удаления. Измененные данные вставляются, а старая строка удаляется. В PostgreSQL исходная строка сохраняется, чтобы транзакция может откатиться, если возникла проблема. Вместо удаления исходной строки она помечается для позднейшего удаления, что приводит к появлению неиспользуемых строк (или кортежей), которые по-прежнему находятся на диске, но более не требуются.
Имеющий соответствующее название процесс очистки окончательно удаляет эти строки, освобождает пространство, которое в противном случае могло бы быть потеряно, и обновляет статистику.
Процесс очистки неиспользуемых строк называется процессом очистки. Если эти строки были оставлены на диске, база данных займет больше места на диске, которое оно требуется, как база данных "blat". Процесс VACUUM важен по следующим причинам:
- Восстановление дискового пространства, занятого строками, помеченными для удаления.
- Обновление статистики данных для использования планировщиком запросов.
- Обновление карты видимости для ускорения проверок только индексов.
- Защита от потери старых данных из-за обхода идентификатора транзакции.
PostgreSQL использует процесс очистки для окончательного удаления строк и освобождения пространства. Помимо освобождения пространства он также гарантирует эффективность индексов.
Когда процесс очистки активируется автоматически, он называется автоматической очисткой. Частота выполнения процесса зависит от объема операций обновления и удаления. Вы также можете отслеживать количество строк, помеченных для удаления.
Периодический запуск процесса очистки гарантирует, что не возникнут следующие ситуации.
- Опыт "больших двоичных объектов", включая более крупные, чем необходимые базы данных и таблицы.
- Большие неоптимальные индексы.
- Увеличение объема операций ввода-вывода.
Чтобы отслеживать количество неиспользуемых строк в таблице, можно выполнить запрос SELECT:
SELECT relname, n_dead_tup, n_live_tup
FROM pg_catalog.pg_stat_all_tables
ORDER BY n_dead_tup DESC;
Чтобы запустить процесс очистки вручную, введите:
vacuum