Разделенная таблица Postgresql использует пространство, несмотря на отсутствие записей

Недавно мы разбили главную таблицу на несколько миллионов строк. Эта таблица разделена на "диапазон идентификаторов". Под этой главной таблицей создано 7 дочерних таблиц, и записи вставляются в дочернюю таблицу во время вставки. Все это управляется расширением pg_partman.

При выполнении этого запроса показано, что основная таблица занимает около 300 ГБ дискового пространства. Это странно, потому что в этой таблице нет записей, и я могу подтвердить это, запустив функцию check_parent().

SELECT nspname || '.' || relname AS "relation",pg_size_pretty(pg_relation_size(C.oid)) AS "size"  FROM pg_class C  LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
WHERE nspname NOT IN ('pg_catalog', 'information_schema')  ORDER BY pg_relation_size(C.oid) DESC  LIMIT 30;

У нас никогда не было этой проблемы при разделении этой таблицы в других средах, где данных не так много. Может ли это быть из-за невыпущенного дискового пространства во время разбиения?

1 ответ

Да, это может быть связано с неизданным дисковым пространством. Вы должны сделать VACUUM FULL после перемещения данных в различные структуры, такие как секционированные таблицы.

PostgreSQL обычно не освобождает табличное пространство автоматически. Нормальный (автоматический) VACUUM ANALYZE поддерживает базу данных, но не сжимает таблицы на диске. VACUUM FULL однако блокирует стол, поэтому будьте осторожны, чтобы не запустить его в обычные часы работы.

Другие вопросы по тегам