Thread: table and index size

table and index size

From
Damon Fasching
Date:
Is there a way to determine the size of a table? an index?
I didn't see anything in the reference manual about this so just did a
'du' before and after creating and populating a table and then again after
creating an index on the table.  The numbers I got were shockingly low.

I created a table with two int4 columns and inserted 100 K rows.  The
change in disk usage was only 4.3 KBytes, or .17 bits per integer.

One of the columns had values ranging from 0 to 3.  The other had random
32 bit integers.  Making an index (btree) on either column used an
additional 1.8 KB, or .14 bits per row.

These numbers were a little surprising, so I du'ed / to see if the data
was being hidden somewhere, and got the same differences.

So, I guess there are two questions here.

1) Do these numbers seem reasonable to someone with a little more
Postgresql experience?

2) Are there commands to determine directly the size of a database, a
table and an index?

One further question, if anyone can comment.  I have the New Riders
PostgreSQL Essential Reference book.  It claims that in my database
directory I should find some files with plain text names.  As an example
they say that "$PGBASE/payroll_idx" is the name of the payroll index file.
All of the files in my database directory have opaque names like
"$PGBASE/16555/16475".  Is there a way to generate more human filenames or
is the New Riders book just off base on this?

Thanks,
 Damon




Re: table and index size

From
Curt Sampson
Date:
On Mon, 15 Jul 2002, Damon Fasching wrote:

> Is there a way to determine the size of a table? an index?

The pg_class table has the size of every object in (usually 8K) pages. So:

    SELECT relname, reltype, relpages, relpages / 128 AS MB
    FROM pg_class
    WHERE relname LIKE 'session%'

or whatever.

> I created a table with two int4 columns and inserted 100 K rows.  The
> change in disk usage was only 4.3 KBytes, or .17 bits per integer.

Something's wrong there. Did you sync? 430 KB I'd believe.

> 1) Do these numbers seem reasonable to someone with a little more
> Postgresql experience?

No, they're completely out to lunch. ints are 4 bytes. postgres
row overhead is around about 40 bytes or so.

> One further question, if anyone can comment.  I have the New Riders
> PostgreSQL Essential Reference book.  It claims that in my database
> directory I should find some files with plain text names.

It's based on an old version of postgres. Now we use the object
IDs. So change the above query:

    SELECT relname, reltype, relfilenode, relpages, relpages / 128 AS MB
    FROM pg_class
    WHERE relname LIKE 'session%'

cjs
--
Curt Sampson  <cjs@cynic.net>   +81 90 7737 2974   http://www.netbsd.org
    Don't you know, in this new Dark Age, we're all light.  --XTC


Re: table and index size

From
Tom Lane
Date:
Curt Sampson <cjs@cynic.net> writes:
> On Mon, 15 Jul 2002, Damon Fasching wrote:
>> Is there a way to determine the size of a table? an index?

> The pg_class table has the size of every object in (usually 8K) pages. So:

>     SELECT relname, reltype, relpages, relpages / 128 AS MB
>     FROM pg_class
>     WHERE relname LIKE 'session%'

Note that those numbers are only up to date if you've vacuumed recently.

>> I created a table with two int4 columns and inserted 100 K rows.  The
>> change in disk usage was only 4.3 KBytes, or .17 bits per integer.

> Something's wrong there. Did you sync? 430 KB I'd believe.

I'd believe 4300 KB, but not anything much less than that.
I doubt sync has anything to do with it; I'd wonder whether he
was du'ing the right place with the right privileges.  $PGDATA is
normally not readable by anyone except the postgres user...

            regards, tom lane