x

Добро пожаловать в IT Leader Assistant.
Please Войти!

Создать аккаунт

Почему размер таблиц в PostgreSQL растет при апдейтах даже без вставок?

Максим Шаламов
05-18-2021 11:27
Почему размер таблиц в PostgreSQL растет при апдейтах даже без вставок?
В сегодняшней статье я хотел бы рассмотреть вопросы касающиеся роста размера таблиц в PostgreSQL при апдейтах, почему это происходит и как это работает. Эта проблема будет особенно актуальна для тех у кого очень частые изменения записей в таблицах. Также мы рассмотрим общие моменты работы транзакций и MVCC. И так приступим.
Для начала возьмем простую таблицу с тремя полями.
id - первичный ключ с автоинкрементом
description - текстовое поле без ограничений
data - jsonb поле без ограничений
Генерируем 1000 записей в таблице, данные сейчас не так важны.
Как мы видим количество мертвых таплов 0, а живых 1000, что это такое рассмотрим ниже, сейчас сконцентрируемся на воспроизведении потенциальной проблемы.
Размер нашей таблицы совсем небольшой.
А теперь я просто изменю значение каждого поля data по 1 разу.
И размер таблицы вырос в 2е, хотя содержательная часть таблицы не изменилась, размер самих записей остался примерно тем же. Теперь продолжим изменять записи в таблице.
Для чистоты эксперимента я просто записывал те же данные в те же поля. Итак давайте разбираться как это работает и что с этим делать.
PostgreSQL реализует модель MVCC (Multiversion Concurrency Control, Многоверсионное управление конкурентным доступом). Это означает, что каждый SQL-оператор видит снимок данных (версию базы данных) на определенный момент времени, вне зависимости от текущего состояния данных. Этот подход позволяет сокращать количество блокировок на уровне строк и таблиц, что сильно увеличивает быстродействие. Фактически это означает, что postgresql при обычных операциях физически не удаляет кортежи, удалённые или устаревшие в результате обновления. Они сохраняются в ней, пока не будет выполнена команда VACUUM.
Простая команда VACUUM (без FULL) только высвобождает пространство и делает его доступным для повторного использования. Эта команда может работать параллельно с обычными операциями чтения и записи таблицы, так она не требует исключительной блокировки.
При выполнении VACUUM FULL мы вернем пространство операционной системе, но на это время получим полную блокировку таблицы. VACUUM FULL переписывает всё содержимое таблицы в новый файл на диске, не содержащий ничего лишнего, что позволяет возвратить неиспользованное пространство операционной системе.
Подчищать мертвые кортежи нужно регулярно, если данных много и они интенсивно меняются, нужно закладывать регламентные работы на FULL VACUUM.
Почитать детали про уровни изоляции можно тут. Так же полезной будет эта ссылка на документацию по VACUUM.
Если у вас есть какие-то вопросы или пожелания вы можете воспользоваться формой для связи с нами:

Комментарии

Чтобы оставить комментарий, пожалуйста, авторизуйтесь

Подписывайтесь на обновления

Последние статьи из нашего блога