Commit 0001e98d authored by Tom Lane's avatar Tom Lane

Code and docs review for pg_column_size() patch.

parent f023fc66
<!-- <!--
$PostgreSQL: pgsql/doc/src/sgml/func.sgml,v 1.275 2005/07/30 22:53:15 tgl Exp $ $PostgreSQL: pgsql/doc/src/sgml/func.sgml,v 1.276 2005/08/02 16:11:56 tgl Exp $
PostgreSQL documentation PostgreSQL documentation
--> -->
...@@ -2206,14 +2206,6 @@ PostgreSQL documentation ...@@ -2206,14 +2206,6 @@ PostgreSQL documentation
<entry><literal>5</literal></entry> <entry><literal>5</literal></entry>
</row> </row>
<row>
<entry><literal><function>pg_column_size</function>(<parameter>string</parameter>)</literal></entry>
<entry><type>integer</type></entry>
<entry>Number of bytes required to store the value, which might be compressed</entry>
<entry><literal>pg_column_size('jo\\000se'::bytea)</literal></entry>
<entry><literal>5</literal></entry>
</row>
<row> <row>
<entry><literal><function>position</function>(<parameter>substring</parameter> in <parameter>string</parameter>)</literal></entry> <entry><literal><function>position</function>(<parameter>substring</parameter> in <parameter>string</parameter>)</literal></entry>
<entry><type>integer</type></entry> <entry><type>integer</type></entry>
...@@ -9181,11 +9173,29 @@ SELECT set_config('log_statement_stats', 'off', false); ...@@ -9181,11 +9173,29 @@ SELECT set_config('log_statement_stats', 'off', false);
</para> </para>
<para> <para>
The functions shown in <xref The functions shown in <xref linkend="functions-admin-dbsize"> calculate
linkend="functions-admin-dbsize"> calculate the actual disk space the actual disk space usage of database objects.
usage of database objects.
</para> </para>
<indexterm zone="functions-admin">
<primary>pg_column_size</primary>
</indexterm>
<indexterm zone="functions-admin">
<primary>pg_tablespace_size</primary>
</indexterm>
<indexterm zone="functions-admin">
<primary>pg_database_size</primary>
</indexterm>
<indexterm zone="functions-admin">
<primary>pg_relation_size</primary>
</indexterm>
<indexterm zone="functions-admin">
<primary>pg_complete_relation_size</primary>
</indexterm>
<indexterm zone="functions-admin">
<primary>pg_size_pretty</primary>
</indexterm>
<table id="functions-admin-dbsize"> <table id="functions-admin-dbsize">
<title>Database Object Size Functions</title> <title>Database Object Size Functions</title>
<tgroup cols="3"> <tgroup cols="3">
...@@ -9195,97 +9205,108 @@ SELECT set_config('log_statement_stats', 'off', false); ...@@ -9195,97 +9205,108 @@ SELECT set_config('log_statement_stats', 'off', false);
</thead> </thead>
<tbody> <tbody>
<row>
<entry><function>pg_column_size</function>(<parameter>any</parameter>)</entry>
<entry><type>integer</type></entry>
<entry>Number of bytes used to store a particular value (possibly compressed)</entry>
</row>
<row> <row>
<entry> <entry>
<literal><function>pg_tablespace_size</function>(<parameter>oid</parameter>)</literal> <literal><function>pg_tablespace_size</function>(<parameter>oid</parameter>)</literal>
</entry> </entry>
<entry><type>int8</type></entry> <entry><type>bigint</type></entry>
<entry>Calculates the total disk space used by the tablespace with the specified OID</entry> <entry>Total disk space used by the tablespace with the specified OID</entry>
</row> </row>
<row> <row>
<entry> <entry>
<literal><function>pg_tablespace_size</function>(<parameter>name</parameter>)</literal> <literal><function>pg_tablespace_size</function>(<parameter>name</parameter>)</literal>
</entry> </entry>
<entry><type>int8</type></entry> <entry><type>bigint</type></entry>
<entry>Calculates the total disk space used by the tablespace with the specified name</entry> <entry>Total disk space used by the tablespace with the specified name</entry>
</row> </row>
<row> <row>
<entry> <entry>
<literal><function>pg_database_size</function>(<parameter>oid</parameter>)</literal> <literal><function>pg_database_size</function>(<parameter>oid</parameter>)</literal>
</entry> </entry>
<entry><type>int8</type></entry> <entry><type>bigint</type></entry>
<entry>Calculates the total disk space used by the database with the specified OID</entry> <entry>Total disk space used by the database with the specified OID</entry>
</row> </row>
<row> <row>
<entry> <entry>
<literal><function>pg_database_size</function>(<parameter>name</parameter>)</literal> <literal><function>pg_database_size</function>(<parameter>name</parameter>)</literal>
</entry> </entry>
<entry><type>int8</type></entry> <entry><type>bigint</type></entry>
<entry>Calculates the total disk space used by the database with the specified name</entry> <entry>Total disk space used by the database with the specified name</entry>
</row> </row>
<row> <row>
<entry> <entry>
<literal><function>pg_relation_size</function>(<parameter>oid</parameter>)</literal> <literal><function>pg_relation_size</function>(<parameter>oid</parameter>)</literal>
</entry> </entry>
<entry><type>int8</type></entry> <entry><type>bigint</type></entry>
<entry>Calculates the disk space used by the table or index with the specified OID</entry> <entry>Disk space used by the table or index with the specified OID</entry>
</row> </row>
<row> <row>
<entry> <entry>
<literal><function>pg_relation_size</function>(<parameter>text</parameter>)</literal> <literal><function>pg_relation_size</function>(<parameter>text</parameter>)</literal>
</entry> </entry>
<entry><type>int8</type></entry> <entry><type>bigint</type></entry>
<entry>Calculates the disk space used by the index or table with the specified name. <entry>Disk space used by the table or index with the specified name.
The name may be prefixed with a schema name if required</entry> The name may be qualified with a schema name</entry>
</row> </row>
<row> <row>
<entry> <entry>
<literal><function>pg_complete_relation_size</function>(<parameter>oid</parameter>)</literal> <literal><function>pg_complete_relation_size</function>(<parameter>oid</parameter>)</literal>
</entry> </entry>
<entry><type>int8</type></entry> <entry><type>bigint</type></entry>
<entry>Calculates the total disk space used by the table with the specified OID, <entry>Total disk space used by the table with the specified OID,
including indexes and toasted data</entry> including indexes and toasted data</entry>
</row> </row>
<row> <row>
<entry> <entry>
<literal><function>pg_complete_relation_size</function>(<parameter>text</parameter>)</literal> <literal><function>pg_complete_relation_size</function>(<parameter>text</parameter>)</literal>
</entry> </entry>
<entry><type>int8</type></entry> <entry><type>bigint</type></entry>
<entry>Calculates the total disk space used by the table with the specified name, <entry>Total disk space used by the table with the specified name,
including indexes and toasted data. The name may be prefixed with a schema name if including indexes and toasted data.
required</entry> The table name may be qualified with a schema name</entry>
</row> </row>
<row> <row>
<entry> <entry>
<literal><function>pg_size_pretty</function>(<parameter>int8</parameter>)</literal> <literal><function>pg_size_pretty</function>(<parameter>bigint</parameter>)</literal>
</entry> </entry>
<entry><type>text</type></entry> <entry><type>text</type></entry>
<entry>Formats the size value (in bytes) into a human readable format with size units </entry> <entry>Converts a size in bytes into a human-readable format with size units</entry>
</row> </row>
</tbody> </tbody>
</tgroup> </tgroup>
</table> </table>
<para> <para>
<function>pg_tablespace_size</> and <function>pg_database_size</> accept an <function>pg_column_size</> shows the space used to store any individual
oid or name of a tablespace or database, and return the disk space usage of the specified object. data value.
</para> </para>
<indexterm zone="functions-admin">
<primary>pg_relation_size</primary>
</indexterm>
<para> <para>
<function>pg_relation_size</> accepts the oid or name of a table, index or <function>pg_tablespace_size</> and <function>pg_database_size</> accept
the OID or name of a tablespace or database, and return the total disk
space used therein.
</para>
<para>
<function>pg_relation_size</> accepts the OID or name of a table, index or
toast table, and returns the size in bytes. toast table, and returns the size in bytes.
</para> </para>
<para> <para>
<function>pg_complete_relation_size</> accepts the oid or name of a table or <function>pg_complete_relation_size</> accepts the OID or name of a table
toast table, and returns the size in bytes of the data and all associated or toast table, and returns the size in bytes of the data and all
indexes and toast tables. associated indexes and toast tables.
</para> </para>
<para> <para>
<function>pg_size_pretty</> can be used to format the size of the <function>pg_size_pretty</> can be used to format the result of one of
database objects in a human readable way, using kB, MB, GB or TB as appropriate. the other functions in a human-readable way, using kB, MB, GB or TB as
appropriate.
</para> </para>
</sect1> </sect1>
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/access/heap/tuptoaster.c,v 1.50 2005/07/06 19:02:52 momjian Exp $ * $PostgreSQL: pgsql/src/backend/access/heap/tuptoaster.c,v 1.51 2005/08/02 16:11:57 tgl Exp $
* *
* *
* INTERFACE ROUTINES * INTERFACE ROUTINES
...@@ -268,6 +268,38 @@ toast_raw_datum_size(Datum value) ...@@ -268,6 +268,38 @@ toast_raw_datum_size(Datum value)
return result; return result;
} }
/* ----------
* toast_datum_size
*
* Return the physical storage size (possibly compressed) of a varlena datum
* ----------
*/
Size
toast_datum_size(Datum value)
{
varattrib *attr = (varattrib *) DatumGetPointer(value);
Size result;
if (VARATT_IS_EXTERNAL(attr))
{
/*
* Attribute is stored externally - return the extsize whether
* compressed or not. We do not count the size of the toast
* pointer ... should we?
*/
result = attr->va_content.va_external.va_extsize;
}
else
{
/*
* Attribute is stored inline either compressed or not, just
* calculate the size of the datum in either case.
*/
result = VARSIZE(attr);
}
return result;
}
/* ---------- /* ----------
* toast_delete - * toast_delete -
...@@ -1436,45 +1468,3 @@ toast_fetch_datum_slice(varattrib *attr, int32 sliceoffset, int32 length) ...@@ -1436,45 +1468,3 @@ toast_fetch_datum_slice(varattrib *attr, int32 sliceoffset, int32 length)
return result; return result;
} }
/* ----------
* toast_datum_size
*
* Show the (possibly compressed) size of a datum
* ----------
*/
Size
toast_datum_size(Datum value)
{
varattrib *attr = (varattrib *) DatumGetPointer(value);
Size result;
if (VARATT_IS_EXTERNAL(attr))
{
/*
* Attribute is stored externally - If it is compressed too,
* then we need to get the external datum and calculate its size,
* otherwise we just use the external rawsize.
*/
if (VARATT_IS_COMPRESSED(attr))
{
varattrib *attrext = toast_fetch_datum(attr);
result = VARSIZE(attrext);
pfree(attrext);
}
else
result = attr->va_content.va_external.va_rawsize;
}
else
{
/*
* Attribute is stored inline either compressed or not, just
* calculate the size of the datum in either case.
*/
result = VARSIZE(attr);
}
return result;
}
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/utils/adt/varlena.c,v 1.130 2005/07/29 03:17:55 momjian Exp $ * $PostgreSQL: pgsql/src/backend/utils/adt/varlena.c,v 1.131 2005/08/02 16:11:57 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -2574,38 +2574,49 @@ md5_bytea(PG_FUNCTION_ARGS) ...@@ -2574,38 +2574,49 @@ md5_bytea(PG_FUNCTION_ARGS)
} }
/* /*
* Return the length of a datum, possibly compressed * Return the size of a datum, possibly compressed
*
* Works on any data type
*/ */
Datum Datum
pg_column_size(PG_FUNCTION_ARGS) pg_column_size(PG_FUNCTION_ARGS)
{ {
Datum value = PG_GETARG_DATUM(0); Datum value = PG_GETARG_DATUM(0);
int result; int32 result;
int typlen;
/* fn_extra stores the fixed column length, or -1 for varlena. */ /* On first call, get the input type's typlen, and save at *fn_extra */
if (fcinfo->flinfo->fn_extra == NULL) /* first call? */ if (fcinfo->flinfo->fn_extra == NULL)
{ {
/* On the first call lookup the datatype of the supplied argument */ /* Lookup the datatype of the supplied argument */
Oid argtypeid = get_fn_expr_argtype(fcinfo->flinfo, 0); Oid argtypeid = get_fn_expr_argtype(fcinfo->flinfo, 0);
int typlen = get_typlen(argtypeid);
typlen = get_typlen(argtypeid);
if (typlen == 0) if (typlen == 0) /* should not happen */
{
/* Oid not in pg_type, should never happen. */
elog(ERROR, "cache lookup failed for type %u", argtypeid); elog(ERROR, "cache lookup failed for type %u", argtypeid);
}
fcinfo->flinfo->fn_extra = MemoryContextAlloc(fcinfo->flinfo->fn_mcxt, fcinfo->flinfo->fn_extra = MemoryContextAlloc(fcinfo->flinfo->fn_mcxt,
sizeof(int)); sizeof(int));
*(int *)fcinfo->flinfo->fn_extra = typlen; *((int *) fcinfo->flinfo->fn_extra) = typlen;
} }
else
typlen = *((int *) fcinfo->flinfo->fn_extra);
if (*(int *)fcinfo->flinfo->fn_extra != -1) if (typlen == -1)
PG_RETURN_INT32(*(int *)fcinfo->flinfo->fn_extra); {
/* varlena type, possibly toasted */
result = toast_datum_size(value);
}
else if (typlen == -2)
{
/* cstring */
result = strlen(DatumGetCString(value)) + 1;
}
else else
{ {
result = toast_datum_size(value) - VARHDRSZ; /* ordinary fixed-width type */
PG_RETURN_INT32(result); result = typlen;
} }
PG_RETURN_INT32(result);
} }
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* $PostgreSQL: pgsql/src/include/catalog/pg_proc.h,v 1.379 2005/07/29 14:47:01 momjian Exp $ * $PostgreSQL: pgsql/src/include/catalog/pg_proc.h,v 1.380 2005/08/02 16:11:57 tgl Exp $
* *
* NOTES * NOTES
* The script catalog/genbki.sh reads this file and generates .bki * The script catalog/genbki.sh reads this file and generates .bki
...@@ -3701,7 +3701,7 @@ DATA(insert OID = 2560 ( pg_postmaster_start_time PGNSP PGUID 12 f f t f s 0 11 ...@@ -3701,7 +3701,7 @@ DATA(insert OID = 2560 ( pg_postmaster_start_time PGNSP PGUID 12 f f t f s 0 11
DESCR("postmaster start time"); DESCR("postmaster start time");
/* Column storage size */ /* Column storage size */
DATA(insert OID = 1269 ( pg_column_size PGNSP PGUID 12 f f t f i 1 23 "2276" _null_ _null_ _null_ pg_column_size - _null_ )); DATA(insert OID = 1269 ( pg_column_size PGNSP PGUID 12 f f t f s 1 23 "2276" _null_ _null_ _null_ pg_column_size - _null_ ));
DESCR("bytes required to store the value, perhaps with compression"); DESCR("bytes required to store the value, perhaps with compression");
/* new functions for Y-direction rtree opclasses */ /* new functions for Y-direction rtree opclasses */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment