Временные файлы, которые получают созданные в base/pgsql_tmp
во время выполнения запроса будут получать удалены, если запрос сделан. Вы не должны удалять их вручную.
Эти файлы не имеют никакого отношения к временным таблицам, они используются для хранения данных для больших операций хеширования или сортировки, которые не помещаются в work_mem
.
Убедитесь, что запрос завершен или отменен, попробуйте запустить CHECKPOINT
дважды в строке и посмотреть, все ли файлы там. Если да, это ошибка; произошел сбой сервера PostgreSQL, когда закончилось дисковое пространство?
Если у вас действительно есть старые файлы в base/pgsql_tmp
, которые не удаляются автоматически, я думаю, что их можно удалить вручную. Но в этом случае я бы поставил ошибку с PostgreSQL.
Невозможно избежать больших временных файлов, если ваш план выполнения должен сортировать большие результирующие наборы или создавать большие хэши. Курсоры вам не помогут. Я полагаю, что с for-loops вы имеете в виду перемещение обработки из базы данных в код приложения –, что обычно является ошибкой и только переносит проблему из базы данных в другое место, где обработка менее эффективна.
Измените свой запрос, чтобы он не сортировал или хешировал большие результирующие наборы (уточните у EXPLAIN
). Я знаю, что это не очень полезно, но лучшего способа нет. Вероятно, вам все равно придется это сделать, или вам будет достаточно времени для нескольких часов?
Как вы «посмотреть статистику» и что «временные файлы» вы говорите прочь? Временные таблицы удаляются в конце сеанса, поэтому закрытие сеанса и открытие нового сеанса должны делать трюк. – Patrick
Вышеупомянутое должно быть перемещено в ответ. – d1ll1nger
Наиболее вероятной причиной является (непреднамеренное) Carthesian произведение. – joop