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:
parent
516ff05539
commit
12d3345c0d
@ -151,6 +151,13 @@ typedef struct
|
|||||||
static MemoryContext CollationCacheContext = NULL;
|
static MemoryContext CollationCacheContext = NULL;
|
||||||
static collation_cache_hash *CollationCache = 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)
|
#if defined(WIN32) && defined(LC_MESSAGES)
|
||||||
static char *IsoLocaleName(const char *);
|
static char *IsoLocaleName(const char *);
|
||||||
#endif
|
#endif
|
||||||
@ -1570,6 +1577,9 @@ pg_newlocale_from_collation(Oid collid)
|
|||||||
if (collid == DEFAULT_COLLATION_OID)
|
if (collid == DEFAULT_COLLATION_OID)
|
||||||
return &default_locale;
|
return &default_locale;
|
||||||
|
|
||||||
|
if (last_collation_cache_oid == collid)
|
||||||
|
return last_collation_cache_locale;
|
||||||
|
|
||||||
cache_entry = lookup_collation_cache(collid);
|
cache_entry = lookup_collation_cache(collid);
|
||||||
|
|
||||||
if (cache_entry->locale == 0)
|
if (cache_entry->locale == 0)
|
||||||
@ -1695,6 +1705,9 @@ pg_newlocale_from_collation(Oid collid)
|
|||||||
cache_entry->locale = resultp;
|
cache_entry->locale = resultp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
last_collation_cache_oid = collid;
|
||||||
|
last_collation_cache_locale = cache_entry->locale;
|
||||||
|
|
||||||
return cache_entry->locale;
|
return cache_entry->locale;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user