On Thursday January 27 2005 12:08, Neil Conway wrote: > On Thu, 2005-01-27 at 08:05 +0100, Michael Paesold wrote: > > Perhaps you could rename indices_size to indexes_size. > > Yeah, sorry -- forgot to mention that. I believe we decided to > standardize on "indexes" as the plural of "index" (at least in > user-visible stuff) a few releases go.
Attached patch identical except for s/indices/indexes/g. Ed
Index: contrib/dbsize/README.dbsize =================================================================== RCS file: /projects/cvsroot/pgsql/contrib/dbsize/README.dbsize,v retrieving revision 1.4 diff -r1.4 README.dbsize 1,2c1,2 < This module contains several functions that report the size of a given < database object: --- > This module contains several functions that report the amount of diskspace > occupied by a given database object according to the stat function: 5a6,7 > int8 aggregate_relation_size(text) > int8 indexes_size(text) 13c15 < The first two functions: --- > The first four functions: 16a19,20 > SELECT aggregate_relation_size('pg_class'); > SELECT indexes_size('pg_class'); 18,19c22,23 < take the name of the object (possibly schema-qualified, for relation_size), < while these functions take object OIDs: --- > take the name of the object (possibly schema-qualified, for relation_size > and aggregate_relation_size), while these functions take object OIDs: 25,28c29,64 < 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: --- > The function relation_size() returns the size of a relation including the > size of any toast tables and toast indexes. It does not include the > size of dependent indexes. > > The function aggregate_relation_size() returns the size of a relation > including the size of any toast tables, toast indexes, and dependent > indexes. > > The function indexes_size() returns the size of all user-defined indexes > for the given relation. It does not include the size of the relation > data nor does it include the size of any relation toast data. > > Here's an example with a table called 'fat' that illustrates > the differences between relation_size and aggregate_relation_size: > > select indexes_size(n.nspname||'.'||c.relname) as idx, > relation_size(n.nspname||'.'||c.relname) as rel, > aggregate_relation_size(n.nspname||'.'||c.relname) as total, > c.relname, c.relkind as kind, c.oid, c.relfilenode as node > from pg_class c, pg_namespace n > where c.relnamespace = n.oid > and (c.relname like 'fat%' or c.relname like 'pg_toast%') > order by total, c.relname > > (snipped) > idx | rel | total | relname | kind | oid | node > ---------+---------+---------+----------------------+------+-------+------- > 0 | 32768 | 32768 | pg_toast_59383_index | i | 59388 | 59388 > 32768 | 704512 | 737280 | pg_toast_59383 | t | 59386 | 59386 > 0 | 1818624 | 1818624 | fat_idx | i | 59389 | 59389 > 1818624 | 761856 | 2580480 | fat | r | 59383 | 59383 > > Please note that pg_relation_size reports 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: 45a82,83 > Alternatively, just use the aggregate_relation_size() function. > 51a90,95 > > Wishlist: > - include size of serial sequence objects > - make pg_* functions include toast, indexes, and sequences; > - maybe other dependent objects as well? triggers, procs, etc > Index: contrib/dbsize/dbsize.c =================================================================== RCS file: /projects/cvsroot/pgsql/contrib/dbsize/dbsize.c,v retrieving revision 1.16 diff -r1.16 dbsize.c 24a25 > #include "utils/relcache.h" 36a38,39 > Datum aggregate_relation_size(PG_FUNCTION_ARGS); > Datum indexes_size(PG_FUNCTION_ARGS); 44a48,49 > PG_FUNCTION_INFO_V1(aggregate_relation_size); > PG_FUNCTION_INFO_V1(indexes_size); 283a289,387 > /* > * Compute on-disk size of files for 'relation' according to the stat function, > * optionally including heap data, index data, and/or toast data. > */ > static int64 > calculate_size(Relation relation, > bool countData, > bool countToast, > bool countIndices) > { > Relation idxrelation; > Relation toastrelation; > Oid relnodeOid; > Oid tblspcOid; > Oid toastOid; > bool hasIndices; > int64 size = 0; > List *indexoidlist; > ListCell *idx; > > tblspcOid = relation->rd_rel->reltablespace; > relnodeOid = relation->rd_rel->relfilenode; > toastOid = relation->rd_rel->reltoastrelid; > hasIndices = relation->rd_rel->relhasindex; > > if ( countData ) { > size += calculate_relation_size(tblspcOid, relnodeOid); > } > > if ( hasIndices && countIndices ) { > /* recursively include any dependent indexes ... */ > indexoidlist = RelationGetIndexList(relation); > foreach(idx, indexoidlist) { > idxrelation = relation_open(lfirst_oid(idx), AccessShareLock); > size += calculate_size(idxrelation, TRUE, TRUE, TRUE); > relation_close(idxrelation, AccessShareLock); > } > list_free(indexoidlist); > } > > if ( toastOid != 0 && countToast ) { > > /* recursively include any toast relations ... */ > toastrelation = relation_open(toastOid, AccessShareLock); > size += calculate_size(toastrelation, TRUE, TRUE, TRUE); > relation_close(toastrelation, AccessShareLock); > } > > return size; > } > > /* > * Compute on-disk size of files for 'relation' including > * heap data, index data, and toasted data. > */ > Datum > aggregate_relation_size(PG_FUNCTION_ARGS) > { > text *relname = PG_GETARG_TEXT_P(0); > RangeVar *relrv; > Relation relation; > int64 size = 0; > > relrv = makeRangeVarFromNameList( > textToQualifiedNameList(relname, "aggregate_relation_size")); > > relation = relation_openrv(relrv, AccessShareLock); > size = calculate_size(relation, TRUE, TRUE, TRUE); > relation_close(relation, AccessShareLock); > > PG_RETURN_INT64(size); > } > > /* > * Compute on-disk size of indexes for 'relation'. > */ > Datum > indexes_size(PG_FUNCTION_ARGS) > { > text *relname = PG_GETARG_TEXT_P(0); > RangeVar *relrv; > Relation relation; > int64 size = 0; > > relrv = makeRangeVarFromNameList( > textToQualifiedNameList(relname, "indexes_size")); > > relation = relation_openrv(relrv, AccessShareLock); > size = calculate_size(relation, FALSE, FALSE, TRUE); > relation_close(relation, AccessShareLock); > > PG_RETURN_INT64(size); > } > > > /* > * Compute on-disk size of files for 'relation' including > * heap data and toasted data, but excluding indexes. > */ 290,291c394 < Oid relnodeOid; < Oid tblspcOid; --- > int64 size = 0; 296,299c399 < < tblspcOid = relation->rd_rel->reltablespace; < relnodeOid = relation->rd_rel->relfilenode; < --- > size = calculate_size(relation, TRUE, TRUE, FALSE); 302c402 < PG_RETURN_INT64(calculate_relation_size(tblspcOid, relnodeOid)); --- > PG_RETURN_INT64(size); 304a405 > Index: contrib/dbsize/dbsize.sql.in =================================================================== RCS file: /projects/cvsroot/pgsql/contrib/dbsize/dbsize.sql.in,v retrieving revision 1.4 diff -r1.4 dbsize.sql.in 8a9,16 > CREATE FUNCTION aggregate_relation_size (text) RETURNS bigint > AS 'MODULE_PATHNAME', 'aggregate_relation_size' > LANGUAGE C STRICT; > > CREATE FUNCTION indexes_size (text) RETURNS bigint > AS 'MODULE_PATHNAME', 'indexes_size' > LANGUAGE C STRICT; >
---------------------------(end of broadcast)--------------------------- TIP 9: the planner will ignore your desire to choose an index scan if your joining column's datatypes do not match