commit 148642d81f046b7d72b3a40182c165e42a8ab6d7
Author: Denis Smirnov <darthunix@gmail.com>
Date:   Thu Aug 31 08:51:14 2023 +0700

    Change tuple table slot for Unique node to "virtual"
    
    The Unique node uses minimal TTS implementation to copy the unique
    tuples from the sorted stream into the resulting tuple slot. But if
    we replace the minimal TTS with the virtual TTS copy method, the
    performance improves.
    
    1. Minimal TTS always allocates zeroed memory for the materialized
       tuple.
    2. Virtual TTS doesn't allocate additional memory for the tuples
       with the columns passed by value. For the columns with external
       memory we don't need to zero the bytes but can simply take the
       memory chunk from the free list "as is".

diff --git a/src/backend/executor/nodeUnique.c b/src/backend/executor/nodeUnique.c
index 45035d74fa..c859add6e0 100644
--- a/src/backend/executor/nodeUnique.c
+++ b/src/backend/executor/nodeUnique.c
@@ -141,7 +141,7 @@ ExecInitUnique(Unique *node, EState *estate, int eflags)
 	 * Initialize result slot and type. Unique nodes do no projections, so
 	 * initialize projection info for this node appropriately.
 	 */
-	ExecInitResultTupleSlotTL(&uniquestate->ps, &TTSOpsMinimalTuple);
+	ExecInitResultTupleSlotTL(&uniquestate->ps, &TTSOpsVirtual);
 	uniquestate->ps.ps_ProjInfo = NULL;
 
 	/*
