Re: Giant TOAST tables due to many almost empty pages

From: Rumko <rumcic(at)gmail(dot)com>
To: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
Cc: pgsql-bugs(at)postgresql(dot)org
Subject: Re: Giant TOAST tables due to many almost empty pages
Date: 2010-05-13 16:23:35
Message-ID: 201005131823.39725.rumcic@gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-bugs

On Thursday 13. of May 2010 17:24:47 Tom Lane wrote:
> Rumko <rumcic(at)gmail(dot)com> writes:
> > Tom Lane wrote:
> >> There's something extremely wacko about that vacuum output.
> >
> > Regarding storage paramaters, you mean ALTER TABLE x SET STORAGE...? Then
> > no.
>
> No, I was wondering about ALTER TABLE ... SET (fillfactor = n).
> It would be worth checking to see if you get a nonnull result from
> select reloptions from pg_class where relname = 'pg_toast_1066371';

Returns NULL.

> The funny behavior would be partially explained if the toast table has a
> ridiculously small fillfactor --- in particular that would explain
> VACUUM claiming there's no free space, as well as the bloat caused by
> having only one useful toast row per page.
>
> There's still the question of why it's toasting such short values at
> all, but I think I see that: your table rows contain 500 non-toastable
> columns, either bigints or timestamps, each of which requires 8 bytes.
> So assuming those are all non-null, that's 4000 unremovable bytes right
> there. The toast code then goes nuts trying to push out all the
> toastable columns to bring the tuple down to target size; it's going to
> push columns to toast that ordinarily wouldn't get pushed.

This does not bother me, the amount in the toast tables is miniscule and comes
up to ~275MB at the end and as far as performance goes, there were no
noticable problems (it's quite fast).

>
> You might want to think about collapsing all those standalone bigint
> columns into an array.

The current design is not final yet, but for now it has proven (with the
exception of the 2 tables that have giant toast tables) to be the most useful
(administration vs. speed vs. ease of use). There will be more
experimentation.

>
> Maybe the toast heuristics should be modified to cope a bit more
> gracefully with a case like this. Pushing out a relatively small column
> in order to get down from 4200 to 4100 bytes doesn't seem like a win.
> OTOH, this is by no stretch of the imagination a good schema design, so
> I'm not sure how excited people will be about making it perform better.
>
> regards, tom lane

As far as I'm concerned, the TOAST table itself does not bother me even if I
have a few bytes per row there, only the part where VACUUM claims no free
space even though pages are more empty than not.

From what I can tell, the problem seems to be in the fsm? Used pg_freespace
from the pg_freespacemap module and it claims that there are no pages in the
toast table that have any free space left (on the other hand vacuum shows
that each page has a max of 122 bytes of data ... so there should still be
~8000 bytes of free space left, right?). I tested this on a table that I
already ran VACUUM FULL and CLUSTER on it and on a table that I didn't, but
for both, pg_freespace claimed that all pages were full for the toast table.
--
Regards,
Rumko

In response to

Responses

Browse pgsql-bugs by date

  From Date Subject
Next Message Tom Lane 2010-05-13 19:43:37 Re: Giant TOAST tables due to many almost empty pages
Previous Message Tom Lane 2010-05-13 15:24:47 Re: Giant TOAST tables due to many almost empty pages