Извините за плохой заголовок. Я не могу придумать лучшего.
Вопрос:
Множество строк вставляются каждую секунду. Пакетное удаление выполняется, когда диск почти заполнен. Это вызывает две проблемы:
Невозможно реально проверить, сколько места в том, сколько страниц можно использовать повторно. Все, что я вижу, это то, что диск почти заполнен, потому что база данных не возвращает дисковое пространство ОС после удаления.
Фрагментация происходит. Использование диска медленно растет и в конечном итоге становится полным, что приводит к сбою машины.
Решения, которые я рассмотрел:
Отслеживание использования диска и выполнение VACCUM FULL
, когда диск заполнен на 48%. Но резервирование 52% (да, диск в основном занят базой данных) диска только для удаления записей звучит очень расточительно.
Разделение моих таблиц по часу времени создания записи. Удалите только старые разделы и надейтесь, что удаленные разделы освобождают полные страницы, поэтому autovacuum
вернет дисковое пространство этих полностью пустых страниц.
Используйте базу данных, хранящуюся в файле, например SQLite
. Разделяйте данные на файлы по часам. Загружайте только самые последние 24 часа, если не указано иное. Когда мне нужно удалить, просто удалите файлы. Я не пробовал это, но это звучит слишком много накладных, чтобы прикрепить все 24 базы данных каждый час.
Я действительно ценю любое предложение. Ниже приведены дополнительные детали. Большое спасибо!
Контекст:
В настоящее время я использую PostgreSQL
для размещения потоковых сообщений в социальных сетях. Существует стример, который выполняет пакетную вставку, и промежуточное программное обеспечение, которое выполняет чисто читаемые запросы для клиентских запросов. Все приложение доставляется с использованием Docker image.
Когда стример вставляет записи, однажды диск будет заполнен. Поэтому нам нужно удалить записи. Но удаление записей не освобождает место на диске и может привести к фрагментации. Таким образом, в конечном итоге VACCUM FULL
необходимо, чтобы снова сжать таблицы.
Требование:
Пользователи, которые развертывают это приложение, не являются техническими. Они даже не знают, что такое оболочка / терминал.
Пользователи не будут выполнять обслуживание базы данных. Так что VACUUM FULL
это опция, только когда на диске достаточно места для новых таблиц.