From ceb8f43687dd0baf86fac3a096d98134e06bcec8 Mon Sep 17 00:00:00 2001 From: Bharath Rupireddy Date: Tue, 1 Aug 2023 09:50:20 +0000 Subject: [PATCH v7] Optimize RMV with multi inserts --- src/backend/commands/matview.c | 36 +++++++++++++--------------------- 1 file changed, 14 insertions(+), 22 deletions(-) diff --git a/src/backend/commands/matview.c b/src/backend/commands/matview.c index ac2e74fa3f..c7ab2d1f44 100644 --- a/src/backend/commands/matview.c +++ b/src/backend/commands/matview.c @@ -52,10 +52,7 @@ typedef struct DestReceiver pub; /* publicly-known function pointers */ Oid transientoid; /* OID of new heap into which to store */ /* These fields are filled by transientrel_startup: */ - 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 */ + TableInsertState *ti_state; /* table insert state */ } DR_transientrel; static int matview_maintenance_depth = 0; @@ -454,16 +451,18 @@ transientrel_startup(DestReceiver *self, int operation, TupleDesc typeinfo) { DR_transientrel *myState = (DR_transientrel *) self; Relation transientrel; + int table_am_flags = TABLEAM_USE_MULTI_INSERTS | + TABLEAM_USE_BULKWRITE_BUFFER_ACCESS_STRATEGY; + int table_insert_flags = TABLE_INSERT_SKIP_FSM | + TABLE_INSERT_FROZEN; transientrel = table_open(myState->transientoid, NoLock); - /* - * Fill private fields of myState for use by later routines - */ - myState->transientrel = transientrel; - myState->output_cid = GetCurrentCommandId(true); - myState->ti_options = TABLE_INSERT_SKIP_FSM | TABLE_INSERT_FROZEN; - myState->bistate = GetBulkInsertState(); + /* Fill private fields of myState for use by later routines */ + myState->ti_state = table_insert_begin(transientrel, + GetCurrentCommandId(true), + table_am_flags, + table_insert_flags); /* * Valid smgr_targblock implies something already wrote to the relation. @@ -488,12 +487,7 @@ 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_multi_insert_v2(myState->ti_state, slot); /* We know this is a newly created relation, so there are no indexes */ @@ -507,14 +501,12 @@ static void transientrel_shutdown(DestReceiver *self) { DR_transientrel *myState = (DR_transientrel *) self; + Relation transientrel = myState->ti_state->rel; - FreeBulkInsertState(myState->bistate); - - table_finish_bulk_insert(myState->transientrel, myState->ti_options); + table_insert_end(myState->ti_state); /* close transientrel, but keep lock until commit */ - table_close(myState->transientrel, NoLock); - myState->transientrel = NULL; + table_close(transientrel, NoLock); } /* -- 2.34.1