Собственно, вопрос в заголовке.
PostgreSQL 10. Есть большая таблица на несколько десятков гигабайт и несколько сотен миллионов записей. А вот места на диске совсем нет (пару сотен мегабайт).
Есть ли какие-нибудь колдовские заклинания, чтобы из этой таблички почистить все или часть записей, не имея свободного места?
Ответ
Да, колдовские заклинания есть.
С полной очисткой таблицы справится truncate, требующий на диске только несколько десятков килобайт (под новую пустую таблицу, индексы, да занести информацию в WAL), но только полная очистка.
Если необходимо удалить не всё, но места нет - то необходимо делать:
delete всего более ненужного
vacuum tablename
пустые update нужных строк частями, ничего на самом деле не изменяющие
update tablename set column=column where ...
такие update пометят строки удалёнными где те были и создадут копию в начале таблицы
последующий vacuum tablename сможет возвращать место операционной системе если в конце таблицы остались только пустые страницы без живых данных
Основной фокус - придумать как перемещать только строки из конца таблицы. Индексы же только перестраивать. Можно через удаление и построение обратно, раз всё равно авария и места для работы нет.
Проблема у этого метода если у вас распухла не сама табличка, а её TOAST часть. Тогда таким способом не лечится.
Существует специально обученный perl скрипт pgcompacttable специально написанной для сжатия таблиц в условиях недостатка дискового места и автоматизирующий описанные манипуляции манипуляции.
Комментариев нет:
Отправить комментарий