From 051b4015942475b84b204846b00941dc752995d3 Mon Sep 17 00:00:00 2001 From: Bharath Rupireddy Date: Mon, 25 Mar 2024 07:10:07 +0000 Subject: [PATCH v14 3/3] Optimize REFRESH MATERIALIZED VIEW with multi inserts --- src/backend/commands/matview.c | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/matview.c b/src/backend/commands/matview.c index 6d09b75556..cabc5bc80b 100644 --- a/src/backend/commands/matview.c +++ b/src/backend/commands/matview.c @@ -50,7 +50,7 @@ typedef struct Relation transientrel; /* relation to write to */ CommandId output_cid; /* cmin to insert in output tuples */ int ti_options; /* table_tuple_insert performance options */ - BulkInsertState bistate; /* bulk insert state */ + TableModifyState *mstate; /* table insert state */ } DR_transientrel; static int matview_maintenance_depth = 0; @@ -460,7 +460,10 @@ transientrel_startup(DestReceiver *self, int operation, TupleDesc typeinfo) myState->transientrel = transientrel; myState->output_cid = GetCurrentCommandId(true); myState->ti_options = TABLE_INSERT_SKIP_FSM | TABLE_INSERT_FROZEN; - myState->bistate = GetBulkInsertState(); + myState->mstate = table_modify_begin(TM_KIND_INSERT, + transientrel, + TM_FLAG_MULTI_INSERTS | + TM_FLAG_BAS_BULKWRITE); /* * Valid smgr_targblock implies something already wrote to the relation. @@ -485,12 +488,10 @@ transientrel_receive(TupleTableSlot *slot, DestReceiver *self) * 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->transientrel, - slot, - myState->output_cid, - myState->ti_options, - myState->bistate); + table_modify_buffer_insert(myState->mstate, + myState->output_cid, + myState->ti_options, + slot); /* We know this is a newly created relation, so there are no indexes */ @@ -505,9 +506,9 @@ transientrel_shutdown(DestReceiver *self) { DR_transientrel *myState = (DR_transientrel *) self; - FreeBulkInsertState(myState->bistate); - - table_finish_bulk_insert(myState->transientrel, myState->ti_options); + table_modify_buffer_flush(myState->mstate, myState->output_cid, + myState->ti_options); + table_modify_end(myState->mstate); /* close transientrel, but keep lock until commit */ table_close(myState->transientrel, NoLock); -- 2.34.1