1
0
mirror of https://github.com/postgres/postgres.git synced 2025-06-14 18:42:34 +03:00

Remove the limit on the number of entries allowed in catcaches, and

remove the infrastructure needed to enforce the limit, ie, the global
LRU list of cache entries.  On small-to-middling databases this wins
because maintaining the LRU list is a waste of time.  On large databases
this wins because it's better to keep more cache entries (we assume
such users can afford to use some more per-backend memory than was
contemplated in the Berkeley-era catcache design).  This provides a
noticeable improvement in the speed of psql \d on a 10000-table
database, though it doesn't make it instantaneous.

While at it, use per-catcache settings for the number of hash buckets
per catcache, rather than the former one-size-fits-all value.  It's a
bit silly to be using the same number of hash buckets for, eg, pg_am
and pg_attribute.  The specific values I used might need some tuning,
but they seem to be in the right ballpark based on CATCACHE_STATS
results from the standard regression tests.
This commit is contained in:
Tom Lane
2006-06-15 02:08:09 +00:00
parent e1e133f264
commit 8b9bc234ad
3 changed files with 181 additions and 206 deletions

View File

@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/utils/cache/syscache.c,v 1.103 2006/05/03 22:45:26 tgl Exp $
* $PostgreSQL: pgsql/src/backend/utils/cache/syscache.c,v 1.104 2006/06/15 02:08:09 tgl Exp $
*
* NOTES
* These routines allow the parser/planner/executor to perform
@ -55,14 +55,18 @@
the list sorted alphabetically and adjust the cache numbers
accordingly.
Add your entry to the cacheinfo[] array below. All cache lists are
alphabetical, so add it in the proper place. Specify the relation
OID, index OID, number of keys, and key attribute numbers. If the
relation contains tuples that are associated with a particular relation
(for example, its attributes, rules, triggers, etc) then specify the
attribute number that contains the OID of the associated relation.
This is used by CatalogCacheFlushRelation() to remove the correct
tuples during a table drop or relcache invalidation event.
Add your entry to the cacheinfo[] array below. All cache lists are
alphabetical, so add it in the proper place. Specify the relation OID,
index OID, number of keys, key attribute numbers, and number of hash
buckets. If the relation contains tuples that are associated with a
particular relation (for example, its attributes, rules, triggers, etc)
then specify the attribute number that contains the OID of the associated
relation. This is used by CatalogCacheFlushRelation() to remove the
correct tuples during a table drop or relcache invalidation event.
The number of hash buckets must be a power of 2. It's reasonable to
set this to the number of entries that might be in the particular cache
in a medium-size database.
There must be a unique index underlying each syscache (ie, an index
whose key is the same as that of the cache). If there is not one
@ -90,6 +94,7 @@ struct cachedesc
int reloidattr; /* attr number of rel OID reference, or 0 */
int nkeys; /* # of keys needed for cache lookup */
int key[4]; /* attribute numbers of key attrs */
int nbuckets; /* number of hash buckets for this cache */
};
static const struct cachedesc cacheinfo[] = {
@ -102,7 +107,9 @@ static const struct cachedesc cacheinfo[] = {
0,
0,
0
}},
},
32
},
{AccessMethodRelationId, /* AMNAME */
AmNameIndexId,
0,
@ -112,7 +119,9 @@ static const struct cachedesc cacheinfo[] = {
0,
0,
0
}},
},
4
},
{AccessMethodRelationId, /* AMOID */
AmOidIndexId,
0,
@ -122,7 +131,9 @@ static const struct cachedesc cacheinfo[] = {
0,
0,
0
}},
},
4
},
{AccessMethodOperatorRelationId, /* AMOPOPID */
AccessMethodOperatorIndexId,
0,
@ -132,7 +143,9 @@ static const struct cachedesc cacheinfo[] = {
Anum_pg_amop_amopclaid,
0,
0
}},
},
64
},
{AccessMethodOperatorRelationId, /* AMOPSTRATEGY */
AccessMethodStrategyIndexId,
0,
@ -142,7 +155,9 @@ static const struct cachedesc cacheinfo[] = {
Anum_pg_amop_amopsubtype,
Anum_pg_amop_amopstrategy,
0
}},
},
64
},
{AccessMethodProcedureRelationId, /* AMPROCNUM */
AccessMethodProcedureIndexId,
0,
@ -152,7 +167,9 @@ static const struct cachedesc cacheinfo[] = {
Anum_pg_amproc_amprocsubtype,
Anum_pg_amproc_amprocnum,
0
}},
},
64
},
{AttributeRelationId, /* ATTNAME */
AttributeRelidNameIndexId,
Anum_pg_attribute_attrelid,
@ -162,7 +179,9 @@ static const struct cachedesc cacheinfo[] = {
Anum_pg_attribute_attname,
0,
0
}},
},
2048
},
{AttributeRelationId, /* ATTNUM */
AttributeRelidNumIndexId,
Anum_pg_attribute_attrelid,
@ -172,7 +191,9 @@ static const struct cachedesc cacheinfo[] = {
Anum_pg_attribute_attnum,
0,
0
}},
},
2048
},
{AuthMemRelationId, /* AUTHMEMMEMROLE */
AuthMemMemRoleIndexId,
0,
@ -182,7 +203,9 @@ static const struct cachedesc cacheinfo[] = {
Anum_pg_auth_members_roleid,
0,
0
}},
},
128
},
{AuthMemRelationId, /* AUTHMEMROLEMEM */
AuthMemRoleMemIndexId,
0,
@ -192,7 +215,9 @@ static const struct cachedesc cacheinfo[] = {
Anum_pg_auth_members_member,
0,
0
}},
},
128
},
{AuthIdRelationId, /* AUTHNAME */
AuthIdRolnameIndexId,
0,
@ -202,7 +227,9 @@ static const struct cachedesc cacheinfo[] = {
0,
0,
0
}},
},
128
},
{AuthIdRelationId, /* AUTHOID */
AuthIdOidIndexId,
0,
@ -212,7 +239,9 @@ static const struct cachedesc cacheinfo[] = {
0,
0,
0
}},
},
128
},
{
CastRelationId, /* CASTSOURCETARGET */
CastSourceTargetIndexId,
@ -223,7 +252,9 @@ static const struct cachedesc cacheinfo[] = {
Anum_pg_cast_casttarget,
0,
0
}},
},
256
},
{OperatorClassRelationId, /* CLAAMNAMENSP */
OpclassAmNameNspIndexId,
0,
@ -233,7 +264,9 @@ static const struct cachedesc cacheinfo[] = {
Anum_pg_opclass_opcname,
Anum_pg_opclass_opcnamespace,
0
}},
},
64
},
{OperatorClassRelationId, /* CLAOID */
OpclassOidIndexId,
0,
@ -243,7 +276,9 @@ static const struct cachedesc cacheinfo[] = {
0,
0,
0
}},
},
64
},
{ConversionRelationId, /* CONDEFAULT */
ConversionDefaultIndexId,
0,
@ -253,7 +288,9 @@ static const struct cachedesc cacheinfo[] = {
Anum_pg_conversion_conforencoding,
Anum_pg_conversion_contoencoding,
ObjectIdAttributeNumber,
}},
},
128
},
{ConversionRelationId, /* CONNAMENSP */
ConversionNameNspIndexId,
0,
@ -263,7 +300,9 @@ static const struct cachedesc cacheinfo[] = {
Anum_pg_conversion_connamespace,
0,
0
}},
},
128
},
{ConversionRelationId, /* CONOID */
ConversionOidIndexId,
0,
@ -273,7 +312,9 @@ static const struct cachedesc cacheinfo[] = {
0,
0,
0
}},
},
128
},
{DatabaseRelationId, /* DATABASEOID */
DatabaseOidIndexId,
0,
@ -283,7 +324,9 @@ static const struct cachedesc cacheinfo[] = {
0,
0,
0
}},
},
4
},
{IndexRelationId, /* INDEXRELID */
IndexRelidIndexId,
Anum_pg_index_indrelid,
@ -293,7 +336,9 @@ static const struct cachedesc cacheinfo[] = {
0,
0,
0
}},
},
1024
},
{InheritsRelationId, /* INHRELID */
InheritsRelidSeqnoIndexId,
Anum_pg_inherits_inhrelid,
@ -303,7 +348,9 @@ static const struct cachedesc cacheinfo[] = {
Anum_pg_inherits_inhseqno,
0,
0
}},
},
256
},
{LanguageRelationId, /* LANGNAME */
LanguageNameIndexId,
0,
@ -313,7 +360,9 @@ static const struct cachedesc cacheinfo[] = {
0,
0,
0
}},
},
4
},
{LanguageRelationId, /* LANGOID */
LanguageOidIndexId,
0,
@ -323,7 +372,9 @@ static const struct cachedesc cacheinfo[] = {
0,
0,
0
}},
},
4
},
{NamespaceRelationId, /* NAMESPACENAME */
NamespaceNameIndexId,
0,
@ -333,7 +384,9 @@ static const struct cachedesc cacheinfo[] = {
0,
0,
0
}},
},
256
},
{NamespaceRelationId, /* NAMESPACEOID */
NamespaceOidIndexId,
0,
@ -343,7 +396,9 @@ static const struct cachedesc cacheinfo[] = {
0,
0,
0
}},
},
256
},
{OperatorRelationId, /* OPERNAMENSP */
OperatorNameNspIndexId,
0,
@ -353,7 +408,9 @@ static const struct cachedesc cacheinfo[] = {
Anum_pg_operator_oprleft,
Anum_pg_operator_oprright,
Anum_pg_operator_oprnamespace
}},
},
1024
},
{OperatorRelationId, /* OPEROID */
OperatorOidIndexId,
0,
@ -363,7 +420,9 @@ static const struct cachedesc cacheinfo[] = {
0,
0,
0
}},
},
1024
},
{ProcedureRelationId, /* PROCNAMEARGSNSP */
ProcedureNameArgsNspIndexId,
0,
@ -373,7 +432,9 @@ static const struct cachedesc cacheinfo[] = {
Anum_pg_proc_proargtypes,
Anum_pg_proc_pronamespace,
0
}},
},
2048
},
{ProcedureRelationId, /* PROCOID */
ProcedureOidIndexId,
0,
@ -383,7 +444,9 @@ static const struct cachedesc cacheinfo[] = {
0,
0,
0
}},
},
2048
},
{RelationRelationId, /* RELNAMENSP */
ClassNameNspIndexId,
ObjectIdAttributeNumber,
@ -393,7 +456,9 @@ static const struct cachedesc cacheinfo[] = {
Anum_pg_class_relnamespace,
0,
0
}},
},
1024
},
{RelationRelationId, /* RELOID */
ClassOidIndexId,
ObjectIdAttributeNumber,
@ -403,7 +468,9 @@ static const struct cachedesc cacheinfo[] = {
0,
0,
0
}},
},
1024
},
{RewriteRelationId, /* RULERELNAME */
RewriteRelRulenameIndexId,
Anum_pg_rewrite_ev_class,
@ -413,7 +480,9 @@ static const struct cachedesc cacheinfo[] = {
Anum_pg_rewrite_rulename,
0,
0
}},
},
1024
},
{StatisticRelationId, /* STATRELATT */
StatisticRelidAttnumIndexId,
Anum_pg_statistic_starelid,
@ -423,7 +492,9 @@ static const struct cachedesc cacheinfo[] = {
Anum_pg_statistic_staattnum,
0,
0
}},
},
1024
},
{TypeRelationId, /* TYPENAMENSP */
TypeNameNspIndexId,
Anum_pg_type_typrelid,
@ -433,7 +504,9 @@ static const struct cachedesc cacheinfo[] = {
Anum_pg_type_typnamespace,
0,
0
}},
},
1024
},
{TypeRelationId, /* TYPEOID */
TypeOidIndexId,
Anum_pg_type_typrelid,
@ -443,11 +516,12 @@ static const struct cachedesc cacheinfo[] = {
0,
0,
0
}}
},
1024
}
};
static CatCache *SysCache[
lengthof(cacheinfo)];
static CatCache *SysCache[lengthof(cacheinfo)];
static int SysCacheSize = lengthof(cacheinfo);
static bool CacheInitialized = false;
@ -476,7 +550,8 @@ InitCatalogCache(void)
cacheinfo[cacheId].indoid,
cacheinfo[cacheId].reloidattr,
cacheinfo[cacheId].nkeys,
cacheinfo[cacheId].key);
cacheinfo[cacheId].key,
cacheinfo[cacheId].nbuckets);
if (!PointerIsValid(SysCache[cacheId]))
elog(ERROR, "could not initialize cache %u (%d)",
cacheinfo[cacheId].reloid, cacheId);