Обсуждение: table and index size
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
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
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