Postgres Vacuum не освобождает пространство - PullRequest
0 голосов
/ 06 июля 2018

В моей базе данных есть таблица, занимающая 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; Я вижу, что время последнего вакуума соответствует времени, когда я выполнил команду VACUUM.

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

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

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

1 Ответ

0 голосов
/ 06 июля 2018

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

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

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

(акцент мой)

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

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

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

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

(акцент мой)

...