Re: PSQLException: ERROR: could not write to hash-join temporary file: No space left on device

Calvin Kim <[email protected]> Wed, 13 Nov 2019 13:42:11 +1100
Newsgroups gmane.comp.db.postgresql.novice
Message-ID <CAPhszwuTn=s_wGyUdKYZuyj+mi0a=_zV9CzDwe1YdBjO4Z-Zdg@mail.gmail.com>
Hi Stephen,

Thanks for the advise. I will work with developer to take a look at the
queries and try to optimize them or break them down into chunks.

What is strange for me is that I don't see any files in /base/pgsql_tmp and
that temp_tablespaces is not set in postgresql.conf.
I know that temp files supposed to be removed after process is completed,
but not sure why I'm seeing such a huge numbers in pg_stat_database. Would
there be any maintenance job that clears this?
I'm using PostgreSQL version 9.6.

Thanks,
Calvin



On Wed, Nov 13, 2019 at 11:53 AM Stephen Froehlich <
[email protected]> wrote:

> It seems impossible to use hundreds of gigs of temp space, but I’ve done
> it. Adding temp space beyond 2TB here is not likely to be the right
> solution. Instead you want to avoid needing THAT much temp space in the
> first place. Your
>
> PostgreSQL server is not a large Spark cluster.
>
>
>
> Posting the text of the query here would help … as would the output of
> EXPLAIN [query].
>
>
>
> Yes, optimizing your postgresql.conf for analysis type work is also very
> helpful, but this is not that.
> Here is a good place to start on that … https://pgtune.leopard.in.ua/#/
>
>
>
>
>
> Not having the query here, there are two approaches I’d probably use:
>
>    1. *Optimize The Query to not need such a large join*
>       1. Make sure you have the indexes you need
>       2. Extended statistics bridging the joining variable and those in
>       the WHERE clause will help the query planner a lot in avoiding unnecessary
>       overhead
>       3. Nested queries of this size are likely to be a very bad idea.
>       4. If the underlying tables are partitioned (I assume they are at
>       this size), and you’re joining on a partition variable, try applying the
>       when clause to each hypertable
>    2. *Break the work into chunks*
>       1. Try breaking the work into reasonable-sized chunks, and either
>       loop through or parallelize with a scripting language (bash, R, Python,
>       etc.)
>
>
>
> --Stephen
>
>
>
> *From:* Calvin Kim <[email protected]>
> *Sent:* Tuesday, November 12, 2019 2:28 PM
> *To:* [email protected]
> *Subject:* PSQLException: ERROR: could not write to hash-join temporary
> file: No space left on device
>
>
>
> Hi team,
>
>
>
> I have an issue with Postgres error: *PSQLException: ERROR: could not
> write to hash-join temporary file: No space left on device*
>
> After investigation, I could see that both *work_mem* and
> *temp_tablespace* is NOT specified in postgresql.conf file,
>
> but when I queried database, it showed as 15728kB.
>
>
>
> $ cat postgresql.conf | grep temp_tablespaces
>
> #temp_tablespaces = ''                  # a list of tablespace names, ''
> uses
>
>
>
> $ cat postgresql.conf | grep work_mem
>
> #work_mem = 4MB                         # min 64kB
>
> #maintenance_work_mem = 64MB            # min 1MB
>
> #autovacuum_work_mem = -1               # min 1MB, or -1 to use
> maintenance_work_mem
>
> --Recommend is 64MB
>
>
>
> postgres=# show work_mem;
>
> work_mem
>
> ----------
>
> 15728kB
>
> (1 row)
>
>
>
> I can see that large number of temp files have been created.
>
>
>
> postgres=# SELECT datname, temp_files,temp_bytes from
> pg_catalog.pg_stat_database;
>
>   datname   | temp_files |  temp_bytes
>
> ------------+------------+---------------
>
> postgres   |         24 |      25013533
>
> user_db    |     200797 | 2774922398171
>
> template1  |          0 |             0
>
> template0  |          0 |             0
>
> (4 rows)
>
>
>
> $ free -h
>
>              total       used       free     shared    buffers     cached
>
> Mem:           31G        18G        12G       5.4G       408M        17G
>
> -/+ buffers/cache:       1.4G        29G
>
> Swap:         4.0G       226M       3.8G
>
>
>
> In my opinion, *work_mem* needs to be set since temp files created seem
> quite large.
>
> Can someone please advise the recommended value for work_mem (is 64MB
> recommended?)
>
> And if setting up temp_tablespace is also recommended in this case?
>
>
>
> Thanks,
>
> Calvin
>