её размер, который я вижу через pg_total_relation_size не меняется.
принудительный vacuum не помогает(
Сессия, которая её читала, висит, не завершив транзакцию. Поэтому очистить эти строки нельзя А может и не читала, а просто висит :) Но тут я не уверен
а решение какое? не рукосуйствовать через датагрип?
Да и вообще это нормально / так и не должен. Обычному vacuum редко когда удаётся уменьшить размер таблицы.
Если остался хоть один тапл в последней страницэ базы — то и не изменится. Сервер обрезает только пустые страницы в концэ. В большынстве случаев этого достаточно, поскольку дажэ когда удаляют старые данные — уменьшать занимаемое на диске место не ьребуется, оно всё равно скоро забьётся новыми данными, которые запишутся в тот жэ файл на место старых. Посмотреть, что это именно оно — можно через pgstattuple (это стандартное расшырение). Там есть процэнт свободного места в файлах таблицы (а такжэ процэнт удалённого, но не вычищенного вакуумом). Чтобы это место всё-таки освободить — есть vacuum full (стандартная команда. Требует временно места на диске столько жэ, сколько есть в таблицэ, блокирует таблицу на время выполнения). Есть pg_repack. Он тожэ пепеписывает таблицу в новую, потому тожэ требует места на диске. Зато блокирует таблицу очень ненадолго: он создаёт тииггер для записи всех пришэдшых обновлений, удалений и вставок во временную таблицу, которой пользуется для всех запросов. Есть pgcompacttable, который как раз и переписывает значения так, чтобы они освобождали последние страницы файла и уменьшали занимаемый размер. Делает он это, к сожалению, косвенными методами, так что всё занимает у него много времени, процэссора и ввода-вывода.
а еще вопрос: в оперативке, если таблица превармится с помощью pg_prewarm висеть будут только настоящие данные?
В общем - да, но боюсь после pg_repack этот prewarm придётся перезапускать.
Обсуждают сегодня