postgresql/contrib/dbsize
Tom Lane eb5949d190 Arrange for the postmaster (and standalone backends, initdb, etc) to
chdir into PGDATA and subsequently use relative paths instead of absolute
paths to access all files under PGDATA.  This seems to give a small
performance improvement, and it should make the system more robust
against naive DBAs doing things like moving a database directory that
has a live postmaster in it.  Per recent discussion.
2005-07-04 04:51:52 +00:00
..
dbsize.c Arrange for the postmaster (and standalone backends, initdb, etc) to 2005-07-04 04:51:52 +00:00
dbsize.sql.in Add routines to dbsize to return the index size and total relation size. 2005-02-26 23:31:15 +00:00
Makefile > Please find enclose a submission to fix these problems. 2004-08-20 20:13:10 +00:00
README.dbsize Add routines to dbsize to return the index size and total relation size. 2005-02-26 23:31:15 +00:00

This module contains several functions that report the on-disk size of a 
given database object in bytes:

	int8 database_size(name)
	int8 relation_size(text)
	int8 indexes_size(text)
	int8 total_relation_size(text)

	int8 pg_database_size(oid)
	int8 pg_relation_size(oid)
	int8 pg_tablespace_size(oid)

	text pg_size_pretty(int8)

	setof record relation_size_components(text)

The first four functions take the name of the object (possibly 
schema-qualified for the latter three) and returns the size of the
on-disk files in bytes.

	SELECT database_size('template1');
	SELECT relation_size('pg_class');
	SELECT indexes_size('pg_class');
	SELECT total_relation_size('pg_class');

These functions take object OIDs:
	
	SELECT pg_database_size(1);         -- template1 database
	SELECT pg_relation_size(1259);      -- pg_class table size
	SELECT pg_tablespace_size(1663);    -- pg_default tablespace

The indexes_size() function returns the total size of the indices for a 
relation, including any toasted indices.

The total_relation_size() function returns the total size of the relation,
all its indices, and any toasted data.  

Please note that relation_size and pg_relation_size report only the size of
the selected relation itself; any related indexes or toast tables are not
counted.  To obtain the total size of a table including all indices and
toasted data, use total_relation_size().

The last function, relation_size_components(), returns a set of rows
showing the sizes of the component relations constituting the input 
relation.  

Examples
========

I've loaded the following table with a little less than 3 MB of data for 
illustration:

    create table fat ( id serial, data varchar );
    create index fat_uidx on fat (id);
    create index fat_idx on fat (data);

You can retrieve a rowset containing constituent sizes as follows:

# SELECT relation_size_components('fat');
              relation_size_components              
----------------------------------------------------
 (2088960,65536,2891776,fat,r,59383,59383)
 (32768,704512,737280,pg_toast_59383,t,59386,59386)
 (0,32768,32768,pg_toast_59383_index,i,59388,59388)
 (0,2039808,2039808,fat_idx,i,59389,59389)
 (0,49152,49152,fat_uidx,i,59911,59911)
(5 rows)

To see a more readable output of the rowset:

    SELECT * 
    FROM relation_size_components('fat') AS (idxsize BIGINT, 
                                             datasize BIGINT, 
                                             totalsize BIGINT, 
                                             relname NAME, 
                                             kind "char", 
                                             relid OID, 
                                             node OID) 
    ORDER BY totalsize;

 idxsize | datasize | totalsize |       relname        | kind | relid | node  
---------+----------+-----------+----------------------+------+-------+-------
       0 |    32768 |     32768 | pg_toast_59383_index | i    | 59388 | 59388
       0 |    49152 |     49152 | fat_uidx             | i    | 59911 | 59911
   32768 |   704512 |    737280 | pg_toast_59383       | t    | 59386 | 59386
       0 |  2039808 |   2039808 | fat_idx              | i    | 59389 | 59389
 2088960 |    65536 |   2891776 | fat                  | r    | 59383 | 59383
(5 rows)

To see the sum total size of a relation:

# select total_relation_size('fat');
 total_relation_size 
-------------------------
                 2891776
(1 row)

To see just the size of the uncompressed relation data:

# select relation_size('fat');
 relation_size 
---------------
         65536
(1 row)

To see the size of all related indices:

# select indexes_size('fat');
 indexes_size 
--------------
      2088960
(1 row)

To install, just run make; make install.  Then load the functions
into any database using dbsize.sql.