Ответы:
Благодаря тому, как PostgreSQL обрабатывает транзакции и параллелизм, MVCC - Multi-Version Concurrency Control, вы можете получить раздувание. В PostgreSQL, когда вы делаете UPDATE
или DELETE
, строка фактически не удаляется физически. Для a DELETE
, он просто помечает строку как недоступную для будущих транзакций, а для UPDATE
, под капотом, она комбинируется INSERT
тогда DELETE
, когда предыдущая версия строки помечается как недоступная.
Пока данные помечены как недоступные, они все еще там, и пространство не может быть использовано. Чтобы затем пометить пространство как доступное для использования базой данных, необходимо выполнить вакуумный процесс за операциями и отметить это пространство, доступное для использования базой данных. Однако он не возвращается в операционную систему. Это происходит только тогда, когда на целой странице нет активных строк, что может быть необычно в некоторых рабочих нагрузках. Это может быть полезно для некоторых рабочих нагрузок, поскольку вы можете просто обновить пространство на отдельных страницах внутри файлов данных, не добавляя дополнительные файлы данных.
Проблемы возникают с раздутием, когда существует слишком большое количество мертвых кортежей по сравнению с живыми кортежами. Ходьба и проверка всех флагов видимости требует времени, а наличие большего количества файлов данных для отношения приводит к дополнительной ненужной загрузке ввода-вывода. Раздувание особенно заметно на индексах, которые также могут иметь много мертвых кортежей, иногда намного больше, чем таблица. Раздувание может замедлить поиск и сканирование индекса, что проявляется в медленном увеличении времени запросов и изменении планов запросов.
Вы можете восстановить пространство с помощью pg_reorg , pg_repack , CLUSTER
или VACUUM FULL
. Это будет проходить и реорганизовывать файлы, перемещая кортежи и реорганизовываясь, чтобы убедиться, что нет мертвых кортежей, которые устранят раздувание.
Распространением также можно эффективно управлять, настраивая VACUUM
параметры для каждой таблицы, что помечает пространство мертвых кортежей, доступное для повторного использования в последующих запросах.
Вы можете использовать запросы в PostgreSQL Wiki, относящиеся к Show Bloat Database и Index Bloat, чтобы определить, сколько у вас раздувания, и оттуда сделать небольшой анализ производительности, чтобы увидеть, есть ли у вас проблемы с количеством раздувания в ваших таблицах. ,
Это, вероятно, относится к общим проблемам с индексами, когда в индекс добавляется два или несколько столбцов или в таблице есть перекрывающиеся индексы. То есть несколько индексов с одинаковым набором столбцов в них (что делает один из них ненужным). Я бы просмотрел все индексы в таблицах, чтобы найти перекрывающиеся столбцы, найти индексы, которые являются просто подмножествами других индексов, и удалить их, ЕСЛИ вы можете определить, что они не используются.
Кроме того, по мере обновления данных в таблицах индексы могут стать фрагментированными, что приводит к их увеличению, чем это необходимо. Я не знаком с postgres, но подозреваю, что существуют методы дефрагментации индексов (путем перестроения индексов), которые уменьшают их размер на диске.