Почему слишком большой размер данных после добавления данных в базу?

Здравствуйте. Развернул окружение с Postgres-ом в докере. Сделал импорт данных из дампа весом около 8 гб в итоге размер базы стал порядка 13 гб, если не память не ошибается. Потом потребовалось обновить данные до актуальных из xml файлов. Удаляю значит старые записи в таблицах и php парсю xml файлы и вставляю в таблицы соответствующие. По кол-ву записей новых данных ну от силы на четверть больше, чем было, а база стала весить вместо 13ГБ 52ГБ. Но откуда такая разница в размерах получившейся базы и той, что была со старыми? Что может оказывать влияние на размер?

UPD: Уточняю данные. Например в первоначальном состоянии самая большая табличка содержала 50млн записей и весила при этом 12гб. После обновления имею 75млн записей и вес 26гб. Хотя следую логике должно стать примерно 18.

И еще сделав запрос размеров табличек в консоли получил вывод попимо самих табличек еще и данные: 'nameTable_nameField_idx' и 'nameTable_nameField_pkey', которые тоже так не хило весят, по 6гб. Первое не знаю что, а второе судя по названию первичный ключ. Неужто он так много занимает места, т.е применимо к описываемой выше табличке в 26гб первичные ключ занимает чуть меньше пятой части самой таблицы....
  • Вопрос задан
  • 160 просмотров
Решения вопроса 1
Melkij
@Melkij
PostgreSQL DBA
Удаляю значит старые записи в таблицах и php парсю xml файлы и вставляю в таблицы соответствующие.

Ну и совершенно закономерно получаете двукратный рост как самой таблицы, так и всех индексов. Всё верно.
Почему? Потому что MVCC. Удаление не удаляет данные, т.к. их может кто-то хотеть ещё прочитать из более старых транзакций, а только отмечает xmax - id транзакции, с которой записи перестают быть видимы. Место занимаемое удалёнными строками будет возможно затем переиспользовать под новые данные после прохода vacuum вручную или автовакуумом.

Индексы, разумеется, тоже занимают место. И по той же самой причине индексы в варианте delete всей таблицы + insert будут занимать вдвое больше места.

Когда вы хотите удалить всё из таблицы - вам нужен не delete, а truncate.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
inoise
@inoise
Solution Architect, AWS Certified, Serverless
Индексы конечно занимают место)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы