Страницы

Поиск по вопросам

четверг, 16 мая 2019 г.

PostgreSQL. Можно ли очистить очень большую таблицу, если на диске нет места?

Собственно, вопрос в заголовке. PostgreSQL 10. Есть большая таблица на несколько десятков гигабайт и несколько сотен миллионов записей. А вот места на диске совсем нет (пару сотен мегабайт).
Есть ли какие-нибудь колдовские заклинания, чтобы из этой таблички почистить все или часть записей, не имея свободного места?


Ответ

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

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

Комментариев нет:

Отправить комментарий