Code and docs review for pg_column_size() patch.
This commit is contained in:
parent
f023fc6689
commit
0001e98d54
@ -1,5 +1,5 @@
|
|||||||
<!--
|
<!--
|
||||||
$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
|
|||||||
<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);
|
|||||||
</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);
|
|||||||
</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 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* 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)
|
|||||||
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)
|
|||||||
|
|
||||||
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 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* 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)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 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 @@
|
|||||||
* 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
|
|||||||
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 */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user