aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Paquier <michael@paquier.xyz>2020-08-01 11:49:13 +0900
committerMichael Paquier <michael@paquier.xyz>2020-08-01 11:49:13 +0900
commit022350b8495a8a7ff0ff8dd6791572e91e7cd6fe (patch)
treea868fe45c4092ee3920ba6a0d75e2bd17265e396
parent84c0e4b9bce794da914fe9c062753bf21369745f (diff)
downloadpostgresql-022350b8495a8a7ff0ff8dd6791572e91e7cd6fe.tar.gz
postgresql-022350b8495a8a7ff0ff8dd6791572e91e7cd6fe.zip
Minimize slot creation for multi-inserts of pg_shdepend
When doing multiple insertions in pg_shdepend for the copy of dependencies from a template database in CREATE DATABASE, the same number of slots would have been created and used all the time. As the number of items to insert is not known in advance, this makes most of the slots created for nothing. This improves the slot handling so as slot creation only happens when needed, minimizing the overhead of the operation. Author: Michael Paquier Reviewed-by: Daniel Gustafsson Discussion: https://postgr.es/m/20200731024148.GB3317@paquier.xyz
-rw-r--r--src/backend/catalog/pg_shdepend.c22
1 files changed, 16 insertions, 6 deletions
diff --git a/src/backend/catalog/pg_shdepend.c b/src/backend/catalog/pg_shdepend.c
index ef2b87927ce..30b234e90e1 100644
--- a/src/backend/catalog/pg_shdepend.c
+++ b/src/backend/catalog/pg_shdepend.c
@@ -809,15 +809,19 @@ copyTemplateDependencies(Oid templateDbId, Oid newDbId)
int slotCount;
CatalogIndexState indstate;
TupleTableSlot **slot;
- int nslots;
+ int nslots,
+ max_slots;
+ bool slot_init = true;
sdepRel = table_open(SharedDependRelationId, RowExclusiveLock);
sdepDesc = RelationGetDescr(sdepRel);
- nslots = MAX_PGSHDEPEND_INSERT_BYTES / sizeof(FormData_pg_shdepend);
- slot = palloc(sizeof(TupleTableSlot *) * nslots);
- for (int i = 0; i < nslots; i++)
- slot[i] = MakeSingleTupleTableSlot(sdepDesc, &TTSOpsHeapTuple);
+ /*
+ * Allocate the slots to use, but delay initialization until we know that
+ * they will be used.
+ */
+ max_slots = MAX_PGSHDEPEND_INSERT_BYTES / sizeof(FormData_pg_shdepend);
+ slot = palloc(sizeof(TupleTableSlot *) * max_slots);
indstate = CatalogOpenIndexes(sdepRel);
@@ -842,6 +846,9 @@ copyTemplateDependencies(Oid templateDbId, Oid newDbId)
{
Form_pg_shdepend shdep;
+ if (slot_init)
+ slot[slotCount] = MakeSingleTupleTableSlot(sdepDesc, &TTSOpsHeapTuple);
+
ExecClearTuple(slot[slotCount]);
shdep = (Form_pg_shdepend) GETSTRUCT(tup);
@@ -858,10 +865,11 @@ copyTemplateDependencies(Oid templateDbId, Oid newDbId)
slotCount++;
/* If slots are full, insert a batch of tuples */
- if (slotCount == nslots)
+ if (slotCount == max_slots)
{
CatalogTuplesMultiInsertWithInfo(sdepRel, slot, slotCount, indstate);
slotCount = 0;
+ slot_init = false;
}
}
@@ -874,6 +882,8 @@ copyTemplateDependencies(Oid templateDbId, Oid newDbId)
CatalogCloseIndexes(indstate);
table_close(sdepRel, RowExclusiveLock);
+ /* Drop only the number of slots used */
+ nslots = slot_init ? slotCount : max_slots;
for (int i = 0; i < nslots; i++)
ExecDropSingleTupleTableSlot(slot[i]);
pfree(slot);