Разделенная таблица 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
однако блокирует стол, поэтому будьте осторожны, чтобы не запустить его в обычные часы работы.