mirror of
https://github.com/postgres/postgres.git
synced 2025-05-21 00:02:53 -04:00
Optimize SearchPathCache by saving the last entry.
Repeated lookups are common, so it's worth it to check the last entry before doing another hash lookup. Discussion: https://postgr.es/m/04c8592dbd694e4114a3ed87139a7a04e4363030.camel%40j-davis.com
This commit is contained in:
parent
b14b1eb4da
commit
a86c61c9ee
@ -241,7 +241,8 @@ static bool MatchNamedCall(HeapTuple proctup, int nargs, List *argnames,
|
||||
*
|
||||
* The search path cache is based on a wrapper around a simplehash hash table
|
||||
* (nsphash, defined below). The spcache wrapper deals with OOM while trying
|
||||
* to initialize a key, and also offers a more convenient API.
|
||||
* to initialize a key, optimizes repeated lookups of the same key, and also
|
||||
* offers a more convenient API.
|
||||
*/
|
||||
|
||||
static inline uint32
|
||||
@ -281,6 +282,7 @@ spcachekey_equal(SearchPathCacheKey a, SearchPathCacheKey b)
|
||||
#define SPCACHE_RESET_THRESHOLD 256
|
||||
|
||||
static nsphash_hash * SearchPathCache = NULL;
|
||||
static SearchPathCacheEntry * LastSearchPathCacheEntry = NULL;
|
||||
|
||||
/*
|
||||
* Create or reset search_path cache as necessary.
|
||||
@ -295,6 +297,7 @@ spcache_init(void)
|
||||
return;
|
||||
|
||||
MemoryContextReset(SearchPathCacheContext);
|
||||
LastSearchPathCacheEntry = NULL;
|
||||
/* arbitrary initial starting size of 16 elements */
|
||||
SearchPathCache = nsphash_create(SearchPathCacheContext, 16, NULL);
|
||||
searchPathCacheValid = true;
|
||||
@ -307,12 +310,25 @@ spcache_init(void)
|
||||
static SearchPathCacheEntry *
|
||||
spcache_lookup(const char *searchPath, Oid roleid)
|
||||
{
|
||||
if (LastSearchPathCacheEntry &&
|
||||
LastSearchPathCacheEntry->key.roleid == roleid &&
|
||||
strcmp(LastSearchPathCacheEntry->key.searchPath, searchPath) == 0)
|
||||
{
|
||||
return LastSearchPathCacheEntry;
|
||||
}
|
||||
else
|
||||
{
|
||||
SearchPathCacheEntry *entry;
|
||||
SearchPathCacheKey cachekey = {
|
||||
.searchPath = searchPath,
|
||||
.roleid = roleid
|
||||
};
|
||||
|
||||
return nsphash_lookup(SearchPathCache, cachekey);
|
||||
entry = nsphash_lookup(SearchPathCache, cachekey);
|
||||
|
||||
LastSearchPathCacheEntry = entry;
|
||||
return entry;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
@ -324,6 +340,14 @@ spcache_lookup(const char *searchPath, Oid roleid)
|
||||
static SearchPathCacheEntry *
|
||||
spcache_insert(const char *searchPath, Oid roleid)
|
||||
{
|
||||
if (LastSearchPathCacheEntry &&
|
||||
LastSearchPathCacheEntry->key.roleid == roleid &&
|
||||
strcmp(LastSearchPathCacheEntry->key.searchPath, searchPath) == 0)
|
||||
{
|
||||
return LastSearchPathCacheEntry;
|
||||
}
|
||||
else
|
||||
{
|
||||
SearchPathCacheEntry *entry;
|
||||
SearchPathCacheKey cachekey = {
|
||||
.searchPath = searchPath,
|
||||
@ -352,7 +376,9 @@ spcache_insert(const char *searchPath, Oid roleid)
|
||||
/* do not touch entry->status, used by simplehash */
|
||||
}
|
||||
|
||||
LastSearchPathCacheEntry = entry;
|
||||
return entry;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
Loading…
x
Reference in New Issue
Block a user