TOASTed size

Started by Simon Riggsabout 18 years ago7 messages
#1Simon Riggs
simon@2ndquadrant.com

I'm thinking that there isn't any way currently of working out how big a
compressed toast object is?

All existing functions decompress the object before we do anything to
it, AFAICS. Am I missing something?

So there's no way currently of working out how good your compression is
for individual values or when you have multiple toasted columns, other
than writing a new function?

--
Simon Riggs
2ndQuadrant http://www.2ndQuadrant.com

#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: Simon Riggs (#1)
Re: TOASTed size

Simon Riggs <simon@2ndquadrant.com> writes:

I'm thinking that there isn't any way currently of working out how big a
compressed toast object is?

pg_column_size() ?

regards, tom lane

#3Gregory Stark
stark@enterprisedb.com
In reply to: Tom Lane (#2)
Re: TOASTed size

"Tom Lane" <tgl@sss.pgh.pa.us> writes:

Simon Riggs <simon@2ndquadrant.com> writes:

I'm thinking that there isn't any way currently of working out how big a
compressed toast object is?

pg_column_size() ?

I was going to send the same thing but I think he's looking for the compressed
size of *external* data.

In fact there isn't really any convenient way to find out something is stored
external. pg_column_size reports the toast raw size of externally stored data.

There does seem to be a need for a more general pg_column_info which returns a
tuple (external bool, rawsize integer, storedsize integer).

--
Gregory Stark
EnterpriseDB http://www.enterprisedb.com
Ask me about EnterpriseDB's PostGIS support!

#4Simon Riggs
simon@2ndquadrant.com
In reply to: Gregory Stark (#3)
Re: TOASTed size

On Wed, 2007-12-05 at 08:24 +0000, Gregory Stark wrote:

"Tom Lane" <tgl@sss.pgh.pa.us> writes:

Simon Riggs <simon@2ndquadrant.com> writes:

I'm thinking that there isn't any way currently of working out how big a
compressed toast object is?

pg_column_size() ?

I was going to send the same thing but I think he's looking for the compressed
size of *external* data.

In fact there isn't really any convenient way to find out something is stored
external. pg_column_size reports the toast raw size of externally stored data.

There does seem to be a need for a more general pg_column_info which returns a
tuple (external bool, rawsize integer, storedsize integer).

That sounds more like what I was after.

So let me check my understanding: For TOASTed data pg_column_size()
tells you how many bytes the column value occupies when decompressed. So
there isn't any way of finding out how many bytes a column value
actually occupies when it is both compressed and external?

--
Simon Riggs
2ndQuadrant http://www.2ndQuadrant.com

#5Mark Kirkwood
markir@paradise.net.nz
In reply to: Simon Riggs (#4)
Re: TOASTed size

Simon Riggs wrote:

That sounds more like what I was after.

So let me check my understanding: For TOASTed data pg_column_size()
tells you how many bytes the column value occupies when decompressed. So
there isn't any way of finding out how many bytes a column value
actually occupies when it is both compressed and external?

I dimly recall getting confused by this when writing this guy:

From what I can see: pg_column_size calls toast_datum_size for any
variable length attribute - and then gets the external pointer and
returns its va_extsize component (which looks to me like the
*compressed* size.)

Cheers

Mark

#6Gregory Stark
stark@enterprisedb.com
In reply to: Simon Riggs (#4)
Re: TOASTed size

"Simon Riggs" <simon@2ndquadrant.com> writes:

On Wed, 2007-12-05 at 08:24 +0000, Gregory Stark wrote:

"Tom Lane" <tgl@sss.pgh.pa.us> writes:

Simon Riggs <simon@2ndquadrant.com> writes:

I'm thinking that there isn't any way currently of working out how big a
compressed toast object is?

pg_column_size() ?

I was going to send the same thing but I think he's looking for the compressed
size of *external* data.

In fact there isn't really any convenient way to find out something is stored
external. pg_column_size reports the toast raw size of externally stored data.

There does seem to be a need for a more general pg_column_info which returns a
tuple (external bool, rawsize integer, storedsize integer).

That sounds more like what I was after.

So let me check my understanding: For TOASTed data pg_column_size()
tells you how many bytes the column value occupies when decompressed.

Wait, no, it's supposed to be the actual size on disk. *checks* yeah, it's the
extsize which is the size of the datum in the toast table. So you could find
the compression ratio by calling length() and pg_column_size() at least for
text data.

I still think a single function returning those columns would be a nice thing
to have to make the api complete.

--
Gregory Stark
EnterpriseDB http://www.enterprisedb.com
Get trained by Bruce Momjian - ask me about EnterpriseDB's PostgreSQL training!

#7Gregory Stark
stark@enterprisedb.com
In reply to: Simon Riggs (#4)
Re: TOASTed size

What it turns out is hard to determine is whether the column was stored
externally. To do that you have to rely on the trick of checking
pg_column_size(table.*) and that only works if it's the only column likely to
be stored externally.

--
Gregory Stark
EnterpriseDB http://www.enterprisedb.com
Get trained by Bruce Momjian - ask me about EnterpriseDB's PostgreSQL training!