From fd891115178bc33df87844417e35a724b359af96 Mon Sep 17 00:00:00 2001 From: Bharath Rupireddy Date: Fri, 8 Mar 2024 10:11:41 +0000 Subject: [PATCH v12 2/4] Optimize CTAS with multi inserts --- src/backend/commands/createas.c | 25 +++++++++---------------- 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/src/backend/commands/createas.c b/src/backend/commands/createas.c index 62050f4dc5..7a4415c62f 100644 --- a/src/backend/commands/createas.c +++ b/src/backend/commands/createas.c @@ -53,9 +53,7 @@ typedef struct /* These fields are filled by intorel_startup: */ Relation rel; /* relation to write to */ ObjectAddress reladdr; /* address of rel, for ExecCreateTableAs */ - CommandId output_cid; /* cmin to insert in output tuples */ - int ti_options; /* table_tuple_insert performance options */ - BulkInsertState bistate; /* bulk insert state */ + TableInsertState *ti_state; /* table insert state */ } DR_intorel; /* utility functions for CTAS definition creation */ @@ -552,17 +550,19 @@ intorel_startup(DestReceiver *self, int operation, TupleDesc typeinfo) */ myState->rel = intoRelationDesc; myState->reladdr = intoRelationAddr; - myState->output_cid = GetCurrentCommandId(true); - myState->ti_options = TABLE_INSERT_SKIP_FSM; /* * If WITH NO DATA is specified, there is no need to set up the state for * bulk inserts as there are no tuples to insert. */ if (!into->skipData) - myState->bistate = GetBulkInsertState(); + myState->ti_state = table_insert_begin(intoRelationDesc, + GetCurrentCommandId(true), + TABLEAM_MULTI_INSERTS | + TABLEAM_BULKWRITE_BUFFER_ACCESS_STRATEGY, + TABLE_INSERT_SKIP_FSM); else - myState->bistate = NULL; + myState->ti_state = NULL; /* * Valid smgr_targblock implies something already wrote to the relation. @@ -590,11 +590,7 @@ intorel_receive(TupleTableSlot *slot, DestReceiver *self) * would not be cheap either. This also doesn't allow accessing per-AM * data (say a tuple's xmin), but since we don't do that here... */ - table_tuple_insert(myState->rel, - slot, - myState->output_cid, - myState->ti_options, - myState->bistate); + table_multi_insert_v2(myState->ti_state, slot); } /* We know this is a newly created relation, so there are no indexes */ @@ -612,10 +608,7 @@ intorel_shutdown(DestReceiver *self) IntoClause *into = myState->into; if (!into->skipData) - { - FreeBulkInsertState(myState->bistate); - table_finish_bulk_insert(myState->rel, myState->ti_options); - } + table_insert_end(myState->ti_state); /* close rel, but keep lock until commit */ table_close(myState->rel, NoLock); -- 2.34.1