Прежде всего, с 3 столбцами текста размером ~ 300 Кб размер таблицы не должен превышать 1 ГБ, а всего 100 строк. У вас включен автовакуум? Или вы регулярно запускаете вакуум? Читайте о вакууме в руководстве . Проверьте свои настройки .
Что касается вопроса ОБНОВЛЕНИЕ против ВСТАВКИ / УДАЛЕНИЯ: из-за модели MVCC PostgreSQL каждое ОБНОВЛЕНИЕ фактически является новой ВСТАВКОЙ. Старый ряд будет сохранен и в конечном итоге очищен вакуумом. Используйте ОБНОВЛЕНИЕ , это проще. Ключ к восстановлению пространства / производительности - вакуумирование .
Существует также связанная команда CLUSTER . Переписывает всю таблицу и все индексы в идеальном состоянии. Ударяет VACUUM FULL
, потому что это фактически также REINDEX
. Вы можете попробовать это один раз, чтобы увидеть реальный размер таблицы без мертвых кортежей.
Относительно производительности: PostgreSQL записывает (сжатое) содержимое больших столбцов в таблицы TOAST . Таким образом, стандартные запросы выполняют одно и то же, независимо от размера столбца 30 КБ или 30 МБ. Это влияет только на время получения найденных строк.
Поскольку данные вне линии (TOASTed) также сжимаются, ваша таблица не должна превышать 1 ГБ (включая таблицу TOAST), даже если представление на диске в базе данных обычно занимает в 2-3 раза больше места сырые данные. Обычно это означает, что вы не пылесосите, и на вашем столе много мертвых кортежей.
Одним из побочных эффектов таблиц TOAST является то, что UPDATE может работать лучше , чем INSERT / DELETE. Потому что:
Во время операции ОБНОВЛЕНИЯ значения неизмененных полей обычно
сохраняется как есть; поэтому происходит ОБНОВЛЕНИЕ строки со значениями вне строки
нет затрат на ТОСТ, если не изменяется ни одно из внеплановых значений.
Тем не менее, в вашем случае это не имеет значения, поскольку ваш план состоит в том, чтобы все равно обнулять большие столбцы.