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:
169
src/backend/utils/cache/syscache.c
vendored
169
src/backend/utils/cache/syscache.c
vendored
@ -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);
|
||||
|
Reference in New Issue
Block a user