diff options
author | Tomas Vondra <tomas.vondra@postgresql.org> | 2023-11-25 20:27:04 +0100 |
---|---|---|
committer | Tomas Vondra <tomas.vondra@postgresql.org> | 2023-11-25 20:27:28 +0100 |
commit | c1ec02be1d79eac95160dea7ced32ace84664617 (patch) | |
tree | e0038d6d074d5c9f28f397ec6bf6e4c743c4fe43 /src/backend/executor/execIndexing.c | |
parent | 6ec8262a02a84470a6a5c936e51f6cb641cebce1 (diff) | |
download | postgresql-c1ec02be1d79eac95160dea7ced32ace84664617.tar.gz postgresql-c1ec02be1d79eac95160dea7ced32ace84664617.zip |
Reuse BrinDesc and BrinRevmap in brininsert
The brininsert code used to initialize (and destroy) BrinDesc and
BrinRevmap for each tuple, which is not free. This patch initializes
these structures only once, and reuses them for all inserts in the same
command. The data is passed through indexInfo->ii_AmCache.
This also introduces an optional AM callback "aminsertcleanup" that
allows performing custom cleanup in case simply pfree-ing ii_AmCache is
not sufficient (which is the case when the cache contains TupleDesc,
Buffers, and so on).
Author: Soumyadeep Chakraborty
Reviewed-by: Alvaro Herrera, Matthias van de Meent, Tomas Vondra
Discussion: https://postgr.es/m/CAE-ML%2B9r2%3DaO1wwji1sBN9gvPz2xRAtFUGfnffpd0ZqyuzjamA%40mail.gmail.com
Diffstat (limited to 'src/backend/executor/execIndexing.c')
-rw-r--r-- | src/backend/executor/execIndexing.c | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/src/backend/executor/execIndexing.c b/src/backend/executor/execIndexing.c index 384b39839a0..2fa2118f3c2 100644 --- a/src/backend/executor/execIndexing.c +++ b/src/backend/executor/execIndexing.c @@ -233,15 +233,20 @@ ExecCloseIndices(ResultRelInfo *resultRelInfo) int i; int numIndices; RelationPtr indexDescs; + IndexInfo **indexInfos; numIndices = resultRelInfo->ri_NumIndices; indexDescs = resultRelInfo->ri_IndexRelationDescs; + indexInfos = resultRelInfo->ri_IndexRelationInfo; for (i = 0; i < numIndices; i++) { if (indexDescs[i] == NULL) continue; /* shouldn't happen? */ + /* Give the index a chance to do some post-insert cleanup */ + index_insert_cleanup(indexDescs[i], indexInfos[i]); + /* Drop lock acquired by ExecOpenIndices */ index_close(indexDescs[i], RowExclusiveLock); } |