1
0
mirror of https://github.com/postgres/postgres.git synced 2025-08-09 17:03:00 +03:00
Files
postgres/contrib/dbsize
Tom Lane 2069940bc6 Fix a number of places that were making file-type tests infelicitously.
The places that did, eg,
	(statbuf.st_mode & S_IFMT) == S_IFDIR
were correct, but there is no good reason not to use S_ISDIR() instead,
especially when that's what the other 90% of our code does.  The places
that did, eg,
	(statbuf.st_mode & S_IFDIR)
were flat out *wrong* and would fail in various platform-specific ways,
eg a symlink could be mistaken for a regular file on most Unixen.

The actual impact of this is probably small, since the problem cases
seem to always involve symlinks or sockets, which are unlikely to be
found in the directories that PG code might be scanning.  But it's
clearly trouble waiting to happen, so patch all the way back anyway.
(There seem to be no occurrences of the mistake in 7.4.)
2008-03-31 01:33:13 +00:00
..

This module contains several functions that report the size of a given
database object:

	int8 database_size(name)
	int8 relation_size(text)

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

	text pg_size_pretty(int8)

The first two functions:

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

take the name of the object (possibly schema-qualified, for relation_size),
while 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

Please note that relation_size and pg_relation_size report only the size of
the selected relation itself; any subsidiary indexes or toast tables are not
counted.  To obtain the total size of a table including all helper files
you'd have to do something like:

SELECT *,
    pg_size_pretty(tablesize+indexsize+toastsize+toastindexsize) AS totalsize
FROM
(SELECT pg_relation_size(cl.oid) AS tablesize,
        COALESCE((SELECT SUM(pg_relation_size(indexrelid))::bigint
                  FROM pg_index WHERE cl.oid=indrelid), 0) AS indexsize,
        CASE WHEN reltoastrelid=0 THEN 0
             ELSE pg_relation_size(reltoastrelid)
        END AS toastsize,
        CASE WHEN reltoastrelid=0 THEN 0
             ELSE pg_relation_size((SELECT reltoastidxid FROM pg_class ct
                                    WHERE ct.oid = cl.reltoastrelid))
        END AS toastindexsize
 FROM pg_class cl
 WHERE relname = 'foo') ss;

This sample query utilizes the helper function pg_size_pretty(int8),
which formats the number of bytes into a convenient string using KB, MB,
GB.  It is also contained in this module.

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