Postgres Vacuum не освобождает место

У меня есть таблица в моей базе данных, которая занимает 161 ГБ на жестком диске. Из 200-гигабайтного жесткого диска осталось всего 5 Гб свободного места.

  1. Следующая команда показывает, что моя таблица занимает 161 ГБ на жестком диске,
    select pg_size_pretty(pg_total_relation_size('Employee'));

  2. В таблице около 527 строк. Теперь я удалил 250 строк. Я снова проверил pg_total_relation_size сотрудника. Еще размер 161гб.

  3. Увидев вывод вышеуказанного запроса, я выполнил команду очистки:
    VACUUM VERBOSE ANALYZE Employee;

  4. Я проверил, действительно ли произошла ВАКУУМНАЯ ОЧИСТКА, используя,
    SELECT relname, last_vacuum, last_autovacuum FROM pg_stat_user_tables; Я могу видеть время последней очистки, совпадающее со временем выполнения команды ВАКУУМНАЯ.

  5. Я также выполнил приведенную ниже команду, чтобы увидеть, есть ли мертвые кортежи,
    SELECT relname, n_dead_tup FROM pg_stat_user_tables; Счетчик n_dead_tup для таблицы сотрудников равен 0.

  6. Тем не менее, после всех этих вышеперечисленных команд, если я запускаю
    select pg_size_pretty(pg_total_relation_size('Employee'));, он все еще показывает 161 ГБ.

Могу я узнать причину этого? Также, пожалуйста, поправьте меня, как освободить interface_list.


person vinod hy    schedule 06.07.2018    source источник


Ответы (1)


vacuum физически не "свободно" пространство. Он только помечает больше не используемое пространство как повторно используемое. Таким образом, последующие операторы UPDATE или INSERT могут использовать это пространство вместо добавления к таблице.

Цитата из руководства

Стандартная форма VACUUM удаляет мертвые версии строк в таблицах и индексах и отмечает место, доступное для повторного использования в будущем. Однако это не вернет пространство операционной системе, за исключением особого случая, когда одна или несколько страниц в конце таблицы становятся полностью свободными и можно легко получить монопольную блокировку таблицы.

(выделено мной)

Если вы повторно вставите 250 удаленных строк, вы увидите, что таблица больше не растет, так как вновь вставленные строки просто используют пространство, помеченное как свободное vacuum.

Если вы действительно хотите физически уменьшить размер таблицы до «необходимого», вам нужно запустить vacuum full.

Цитата из руководства

VACUUM FULL активно сжимает таблицы, записывая полную новую версию файла таблицы без мертвого пространства. Это минимизирует размер таблицы, но может занять много времени. Также требуется дополнительное место на диске для новой копии таблицы, пока операция не завершится.

(выделено мной)

person a_horse_with_no_name    schedule 06.07.2018