Hi there, hackers! How about trying out an idea to add an analog to save
memory in WAL files for deleting records, similar to multi-insert
optimization? This patch is trying to do just that.

Best Regards, Stepan Neretin!
diff --git a/src/backend/executor/nodeModifyTable.c b/src/backend/executor/nodeModifyTable.c
index 1161520f76..fb2d4563fd 100644
--- a/src/backend/executor/nodeModifyTable.c
+++ b/src/backend/executor/nodeModifyTable.c
@@ -3816,13 +3816,14 @@ ExecModifyTable(PlanState *pstate)
 	CmdType		operation = node->operation;
 	ResultRelInfo *resultRelInfo;
 	PlanState  *subplanstate;
-	TupleTableSlot *slot;
+	TupleTableSlot *slot = NULL;
 	TupleTableSlot *oldSlot;
 	ItemPointerData tuple_ctid;
 	HeapTupleData oldtupdata;
 	HeapTuple	oldtuple;
 	ItemPointer tupleid;
 	bool		tuplock;
+	List		*items_to_delete = NULL;
 
 	CHECK_FOR_INTERRUPTS();
 
@@ -4179,8 +4180,15 @@ ExecModifyTable(PlanState *pstate)
 				break;
 
 			case CMD_DELETE:
-				slot = ExecDelete(&context, resultRelInfo, tupleid, oldtuple,
-								  true, false, node->canSetTag, NULL, NULL, NULL);
+				ItemPointer item_ptr = (ItemPointer) palloc0(sizeof(ItemPointerData));
+				item_ptr->ip_blkid = tupleid->ip_blkid;
+				item_ptr->ip_posid = tupleid->ip_posid;
+
+				if (!items_to_delete)
+					items_to_delete = list_make1(item_ptr);
+				else
+					items_to_delete = lappend(items_to_delete, item_ptr);
+
 				break;
 
 			case CMD_MERGE:
@@ -4197,10 +4205,28 @@ ExecModifyTable(PlanState *pstate)
 		 * If we got a RETURNING result, return it to caller.  We'll continue
 		 * the work on next call.
 		 */
-		if (slot)
+		if (slot && !(operation == CMD_DELETE))
 			return slot;
 	}
 
+	if (list_length(items_to_delete) > 0)
+	{
+		ListCell *cell;
+		ereport(WARNING, errmsg("NUM ITEMS TO DELETE = %d", list_length(items_to_delete)));
+		foreach(cell, items_to_delete)
+		{
+			ItemPointer item_ptr = (ItemPointer) lfirst(cell);
+			if (!slot)
+				slot = ExecDelete(&context, resultRelInfo, item_ptr, NULL,
+								  true, false, node->canSetTag, NULL, NULL, NULL);
+			else
+				ExecDelete(&context, resultRelInfo, item_ptr, NULL,
+							true, false, node->canSetTag, NULL, NULL, NULL);
+		}
+
+		return slot;
+	}
+
 	/*
 	 * Insert remaining tuples for batch insert.
 	 */

Reply via email to