2016-08-29 2 views
0

У меня есть огромная база данных около 800 ГБ. Когда я попытался запустить запрос, который группирует определенные переменные и агрегирует результат, он останавливается после запуска в течение нескольких часов. Postgres выдавал сообщение о том, что место на диске заполнено. Посмотрев статистику, я понял, что в дБ есть около 400 ГБ временных файлов. Я считаю, что эти временные файлы, созданные при выполнении запроса. Мой вопрос: как удалить эти временные файлы. Кроме того, как мне избежать таких проблем - используйте курсоры или for-loops, чтобы не обрабатывать все данные одновременно? Благодарю.удалить временные файлы в postgresql

Я использую Postgres 9.2

+1

Как вы «посмотреть статистику» и что «временные файлы» вы говорите прочь? Временные таблицы удаляются в конце сеанса, поэтому закрытие сеанса и открытие нового сеанса должны делать трюк. – Patrick

+0

Вышеупомянутое должно быть перемещено в ответ. – d1ll1nger

+0

Наиболее вероятной причиной является (непреднамеренное) Carthesian произведение. – joop

ответ

1

Временные файлы, которые получают созданные в base/pgsql_tmp во время выполнения запроса будут получать удалены, если запрос сделан. Вы не должны удалять их вручную.
Эти файлы не имеют никакого отношения к временным таблицам, они используются для хранения данных для больших операций хеширования или сортировки, которые не помещаются в work_mem.

Убедитесь, что запрос завершен или отменен, попробуйте запустить CHECKPOINT дважды в строке и посмотреть, все ли файлы там. Если да, это ошибка; произошел сбой сервера PostgreSQL, когда закончилось дисковое пространство?

Если у вас действительно есть старые файлы в base/pgsql_tmp, которые не удаляются автоматически, я думаю, что их можно удалить вручную. Но в этом случае я бы поставил ошибку с PostgreSQL.

Невозможно избежать больших временных файлов, если ваш план выполнения должен сортировать большие результирующие наборы или создавать большие хэши. Курсоры вам не помогут. Я полагаю, что с for-loops вы имеете в виду перемещение обработки из базы данных в код приложения –, что обычно является ошибкой и только переносит проблему из базы данных в другое место, где обработка менее эффективна.

Измените свой запрос, чтобы он не сортировал или хешировал большие результирующие наборы (уточните у EXPLAIN). Я знаю, что это не очень полезно, но лучшего способа нет. Вероятно, вам все равно придется это сделать, или вам будет достаточно времени для нескольких часов?

+0

Спасибо. Я использую некоторые пользовательские агрегированные функции, которые, я считаю, создают большие временные файлы. EXPLAIN показывает, что агрегированная функция сортирует данные. Мне было интересно, есть ли способ избежать сортировки в совокупных функциях. Меня не интересует порядок результатов. Продолжительность выполнения нескольких часов приемлема, потому что это разовая обработка данных, но большие временные файлы останавливают выполнение запроса. Благодарю. –

+0

С * пользовательскими агрегатными функциями * вы имеете в виду функции сторонних C? Трудно ответить на этот вопрос, не зная, как определяется эта совокупная функция и как выглядит вывод 'EXPLAIN'. –

-1

попробовать это один

SELECT temp_files AS "Temporary files" 
    , temp_bytes AS "Size of temporary files" 
FROM databse_name db; 
Смежные вопросы