Я получаю ошибку
ОШИБКА: не удалось записать блок 3478284 временного файла: на устройстве не осталось места
при выполнении следующего запроса:
INSERT INTO summary SELECT t1.a, t1.b, SUM(t1.p) AS p, COUNT(t1.*) AS c,
t1.d, t1.r, DATE_TRUNC('month', t1.start) AS month, t2.t AS t, t2.h, t2.x
FROM raw1 t1, raw2 t2
WHERE t1.t2_id=t2.id AND (t2.t<>'a' OR t2.y) GROUP BY month, t, a, b, d, r, h, x
таблица t1 очень большая, а таблица t2 довольно большая
Caused by: org.postgresql.util.PSQLException: ERROR: could not write block 3478284 of temporary file: No space left on device
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:1592)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1327)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:192)
at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:451)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:350)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2Statement.java:304)
любые подсказки приветствуются.
Postgres не хватает места на своей временной свалке при попытке выполнить ваш запрос - способ исправить это - либо запустить более простой запрос (который, вероятно, бесполезен), либо освободить больше места на диске, который содержит PGDATA/base/pgsql_tmp/
(Если вы еще не сделали VACUUM FULL
через некоторое время может быть хорошее время :-)
Вы также можете put pgsql_tmp
на собственном разделе (помните о разрешениях, поскольку Postgres имеет тенденцию к обрывкам в этих вещах)
Обратите внимание, что я верю
pgsql_tmp
в наши дни для каждого табличного пространства, поэтому, если это не главное (base
) заменить табличное пространство соответствующим образом :-)
Добавить место на диске, на который выполняется запись?
Я знаю, что эта тема немного устарела, но подумал, что это может кому-то помочь, поскольку у меня была аналогичная проблема и у меня не было возможности расширить хранилище на удаленном хосте.
Другой способ, которым мне удалось решить эту проблему, заключался в том, чтобы запустить скрипт для выбора записей по частям и перебора записей до тех пор, пока последний результат не вернет никаких записей. Например, вам подойдет что-то вроде следующего.
Обратите внимание на порядок, это очень важно, иначе вы можете выбирать записи, которые уже были выбраны, и в итоге получаются дубликаты (у меня это было).
INSERT INTO summary SELECT t1.a, t1.b, SUM (t1.p) AS p, COUNT (t1. *) AS c, t1.d, t1.r, DATE_TRUNC ('month', t1.start) AS month , t2.t AS t, t2.h, t2.x FROM raw1 t1, raw2 t2 WHERE t1.t2_id = t2.id AND (t2.t <> 'a' OR t2.y) заказ по t1.a, t1 .b limit 100 смещение 0 ГРУППА ПО месяцам, t, a, b, d, r, h, x
При следующем запуске вы устанавливаете смещение на 100 и так далее.
Надеюсь, это кому-то поможет. :)
Я уверен, что postgres использует / tmp для временного хранения, а ваш корневой раздел меньше разделов в вашей системе. Если вы измените временное хранилище postgres на место, где у вас больше места, вы можете это исправить. Или, как говорится в сообщении выше, добавьте больше места. Чтобы убедиться, что это записывается в / tmp, посмотрите файл конфигурации или во время выполнения запроса запускайте ls -lart / tmp снова и снова, и если файлы растут, то это то место, где он пишет. Я не являюсь пользователем postgres, но по большей части вы сможете понять это с помощью того, что я сказал выше.