aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils/cache/syscache.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2006-06-15 02:08:09 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2006-06-15 02:08:09 +0000
commit8b9bc234ad43dfa788bde40ebf12e94f16556b7f (patch)
treed883d471f95e962d7432f3b14d45d06f9a2666e5 /src/backend/utils/cache/syscache.c
parente1e133f2642fa444ad26749edbd9e89e9afbb169 (diff)
downloadpostgresql-8b9bc234ad43dfa788bde40ebf12e94f16556b7f.tar.gz
postgresql-8b9bc234ad43dfa788bde40ebf12e94f16556b7f.zip
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.
Diffstat (limited to 'src/backend/utils/cache/syscache.c')
-rw-r--r--src/backend/utils/cache/syscache.c169
1 files changed, 122 insertions, 47 deletions
diff --git a/src/backend/utils/cache/syscache.c b/src/backend/utils/cache/syscache.c
index ffcb26e3c55..d23fbb9ce2b 100644
--- a/src/backend/utils/cache/syscache.c
+++ b/src/backend/utils/cache/syscache.c
@@ -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);