Назад | Перейти на главную страницу

Размер базы данных Postgresql 9 увеличился после ежедневных массовых обновлений

У меня есть база данных Postgres, в которую я ежедневно импортирую / обновляю около 4 ГБ данных. (Обычно около 15-20 миллионов строк.) Я импортирую данные из дампа плоского файла, используя массовые вставки. У меня также есть триггер стиля «Вставить при дублировании ключа, обновить», который просто обновит строку, если идентификатор уже существует. Сами данные импорта не сильно растут (до размера файла), в основном просто обновляются записи с добавлением небольшого количества новых записей. Кроме того, после каждого импорта я запускаю VACUUM ANALYZE.

Сегодня я заметил, что размер базы данных увеличился примерно до 15 ГБ. Погуглив, я решил попробовать VACUUM FULL и REINDEX. Размер базы данных значительно уменьшился (около 50%). Я читал, что это может быть связано с max_fsm_pages настройка, но похоже, что она была удалена в Postgres 8.4, поэтому я не уверен, что здесь происходит. В журналах postgres нет ничего интересного, что я мог бы увидеть.

Вот стенограмма процесса: http://pastie.org/private/jt7mxajyyxuzvodch9goq

Все таблицы значительно уменьшились, но мне показалось интересным, что до вакуумирования и переиндексации самой большой таблицей был индекс, который составлял 3,7 ГБ (больше, чем даже самая большая таблица содержимого, которая составляла 2,8 ГБ), и уменьшалась до 629 МБ.

Это нормально или здесь что-то не так? Я пытаюсь уменьшить размер файла на диске, поскольку он работает на довольно маленькой виртуальной машине Linode.


ОБНОВЛЕНИЕ: Используя pgAdmin, вот несколько скриншотов вкладки статистики:

Итак, из последнего снимка экрана определенно похоже, что проблема заключается в раздувании индекса. Размер таблицы составляет 3,0 ГБ, а размер индекса - 4,4 ГБ. Таблица app_prices, например, является таблицей с наибольшим количеством строк (около 35 миллионов), имеет только 5 столбцов и 3 индекса. Это все еще кажется нормальным?

Из-за того, как Postgresql реализует MVCC, это, вероятно, нормально.

Редактировать: http://www.postgresql.org/docs/9.0/static/routine-vacuuming.html имеет довольно хорошее объяснение того, что происходит, и как с этим бороться.