1
0
mirror of https://github.com/postgres/postgres.git synced 2025-04-25 21:42:33 +03:00

Remember last collation to speed up collation cache.

This optimization is to avoid a performance regression in an upcoming
patch that will remove lc_collate_is_c().

Discussion: https://postgr.es/m/96a559be83329bc66074a3925ebcfa8ceb16dfc5.camel@j-davis.com
Discussion: https://postgr.es/m/646f662e145ab38cff1c04d475f4448f53fc5042.camel@j-davis.com
Discussion: https://postgr.es/m/54565933-d82f-4d7c-8f47-288b1b570fd8@eisentraut.org
This commit is contained in:
Jeff Davis 2024-09-03 16:05:58 -07:00
parent 516ff05539
commit 12d3345c0d

View File

@ -151,6 +151,13 @@ typedef struct
static MemoryContext CollationCacheContext = NULL;
static collation_cache_hash *CollationCache = NULL;
/*
* The collation cache is often accessed repeatedly for the same collation, so
* remember the last one used.
*/
static Oid last_collation_cache_oid = InvalidOid;
static pg_locale_t last_collation_cache_locale = NULL;
#if defined(WIN32) && defined(LC_MESSAGES)
static char *IsoLocaleName(const char *);
#endif
@ -1570,6 +1577,9 @@ pg_newlocale_from_collation(Oid collid)
if (collid == DEFAULT_COLLATION_OID)
return &default_locale;
if (last_collation_cache_oid == collid)
return last_collation_cache_locale;
cache_entry = lookup_collation_cache(collid);
if (cache_entry->locale == 0)
@ -1695,6 +1705,9 @@ pg_newlocale_from_collation(Oid collid)
cache_entry->locale = resultp;
}
last_collation_cache_oid = collid;
last_collation_cache_locale = cache_entry->locale;
return cache_entry->locale;
}