table and index size

Started by Damon Faschingalmost 24 years ago3 messagesgeneral
Jump to latest
#1Damon Fasching
fasching@design.lbl.gov

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

#2Curt Sampson
cjs@cynic.net
In reply to: Damon Fasching (#1)
Re: table and index size

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

#3Tom Lane
tgl@sss.pgh.pa.us
In reply to: Curt Sampson (#2)
Re: table and index size

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