Document that get_attstatsslot/free_attstatsslot only need to be passed

valid type information if they are asked to fetch the values part of a
pg_statistic slot; these arguments are unneeded if fetching only the
numbers part.  Use this to save a catcache lookup in btcostestimate,
which is looking like a bit of a hotspot in recent profiling.  Not a
big savings, but since it's essentially free, might as well do it.
This commit is contained in:
Tom Lane 2005-10-11 17:27:14 +00:00
parent 07e6f93d6b
commit 0cc0d0822d
2 changed files with 12 additions and 11 deletions

View File

@ -15,7 +15,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/utils/adt/selfuncs.c,v 1.189 2005/09/24 22:54:38 tgl Exp $ * $PostgreSQL: pgsql/src/backend/utils/adt/selfuncs.c,v 1.190 2005/10/11 17:27:14 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -4466,15 +4466,10 @@ btcostestimate(PG_FUNCTION_ARGS)
if (HeapTupleIsValid(tuple)) if (HeapTupleIsValid(tuple))
{ {
Oid typid;
int32 typmod;
float4 *numbers; float4 *numbers;
int nnumbers; int nnumbers;
/* XXX this code would break with different storage type */ if (get_attstatsslot(tuple, InvalidOid, 0,
get_atttypetypmod(relid, colnum, &typid, &typmod);
if (get_attstatsslot(tuple, typid, typmod,
STATISTIC_KIND_CORRELATION, STATISTIC_KIND_CORRELATION,
index->ordering[0], index->ordering[0],
NULL, NULL, &numbers, &nnumbers)) NULL, NULL, &numbers, &nnumbers))
@ -4489,7 +4484,7 @@ btcostestimate(PG_FUNCTION_ARGS)
else else
*indexCorrelation = varCorrelation; *indexCorrelation = varCorrelation;
free_attstatsslot(typid, NULL, 0, numbers, nnumbers); free_attstatsslot(InvalidOid, NULL, 0, numbers, nnumbers);
} }
ReleaseSysCache(tuple); ReleaseSysCache(tuple);
} }

View File

@ -7,7 +7,7 @@
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/utils/cache/lsyscache.c,v 1.127 2005/08/12 21:49:47 tgl Exp $ * $PostgreSQL: pgsql/src/backend/utils/cache/lsyscache.c,v 1.128 2005/10/11 17:27:14 tgl Exp $
* *
* NOTES * NOTES
* Eventually, the index information should go through here, too. * Eventually, the index information should go through here, too.
@ -1841,8 +1841,8 @@ get_attavgwidth(Oid relid, AttrNumber attnum)
* entry, and we don't want to repeat the cache lookup unnecessarily. * entry, and we don't want to repeat the cache lookup unnecessarily.
* *
* statstuple: pg_statistics tuple to be examined. * statstuple: pg_statistics tuple to be examined.
* atttype: type OID of attribute. * atttype: type OID of attribute (can be InvalidOid if values == NULL).
* atttypmod: typmod of attribute. * atttypmod: typmod of attribute (can be 0 if values == NULL).
* reqkind: STAKIND code for desired statistics slot kind. * reqkind: STAKIND code for desired statistics slot kind.
* reqop: STAOP value wanted, or InvalidOid if don't care. * reqop: STAOP value wanted, or InvalidOid if don't care.
* values, nvalues: if not NULL, the slot's stavalues are extracted. * values, nvalues: if not NULL, the slot's stavalues are extracted.
@ -1960,6 +1960,12 @@ get_attstatsslot(HeapTuple statstuple,
return true; return true;
} }
/*
* free_attstatsslot
* Free data allocated by get_attstatsslot
*
* atttype need be valid only if values != NULL.
*/
void void
free_attstatsslot(Oid atttype, free_attstatsslot(Oid atttype,
Datum *values, int nvalues, Datum *values, int nvalues,