Именно таким поисковым запросом хочется описать суть проблемы с очисткой таблицы, для полного освобождения пустых и уже ненужных страниц данных для операционной системы.
VACUUM FULL ВСЕГДА БЛОКИРУЕТ ТАБЛИЦУ ДАЖЕ ДЛЯ ЧТЕНИЯ (актуально на осень 2023)!
Но проблему можно решить зайдя с другой стороны.
Какие предпосылки у такого рода запроса?
- В базе было удалено очень много лишней информации, но место на диске не освободилось
- В базе нет лишних данных, но таблицы сами по себе очень большие и все запросы уже сильно тормозят
- По данным и запросам всё ок, но наведение чистоты надолго вырубит работу клиентского приложения
Для всех этих случаев нужно использовать «Секционирование Таблиц«. Что оно даёт?
Запросы к таблице остаются ровно такими же, но из-за условия секционирования (например по столбцу первичного уникального целочисленного ключа ID) отдельные небольшие таблицы хранят в себе гораздо меньше данных. Механизм секционирования даёт возможность запускать VACUUM FULL для каждой отдельной секции. В нашем случае это значит, что на сайте будет недоступна некоторая часть данных, а не все. То есть работа приложения не блокируется полностью.
Важным в вопросе секционирования останется то, по какому принципу и на какие части вы будете делить главную таблицу. Ещё важный момент — можно создать такое деление на секции, при котором в главной таблице вообще не будет данных, все они будут рассортированы по секциям (специальным таблицам).
Естественно, что такой подход разработки начинает влиять на работу планировщика запросов и ещё некоторые места. Это нужно учитывать.
Информационные ссылки
Официальный сайт WEB-оболочки pgAdmin — https://www.pgadmin.org
Официальный сайт СУБД PostgreSQL — https://www.postgresql.org
Официальный сайт клиента DBeaver для СУБД PostgreSQL — https://dbeaver.io