mirror of
				https://github.com/postgres/postgres.git
				synced 2025-11-03 09:13:20 +03:00 
			
		
		
		
	Support Parallel Append plan nodes.
When we create an Append node, we can spread out the workers over the subplans instead of piling on to each subplan one at a time, which should typically be a bit more efficient, both because the startup cost of any plan executed entirely by one worker is paid only once and also because of reduced contention. We can also construct Append plans using a mix of partial and non-partial subplans, which may allow for parallelism in places that otherwise couldn't support it. Unfortunately, this patch doesn't handle the important case of parallelizing UNION ALL by running each branch in a separate worker; the executor infrastructure is added here, but more planner work is needed. Amit Khandekar, Robert Haas, Amul Sul, reviewed and tested by Ashutosh Bapat, Amit Langote, Rafia Sabih, Amit Kapila, and Rajkumar Raghuwanshi. Discussion: http://postgr.es/m/CAJ3gD9dy0K_E8r727heqXoBmWZ83HwLFwdcaSSmBQ1+S+vRuUQ@mail.gmail.com
This commit is contained in:
		@@ -21,6 +21,7 @@
 | 
			
		||||
#include "lib/pairingheap.h"
 | 
			
		||||
#include "nodes/params.h"
 | 
			
		||||
#include "nodes/plannodes.h"
 | 
			
		||||
#include "storage/spin.h"
 | 
			
		||||
#include "utils/hsearch.h"
 | 
			
		||||
#include "utils/queryenvironment.h"
 | 
			
		||||
#include "utils/reltrigger.h"
 | 
			
		||||
@@ -1000,13 +1001,22 @@ typedef struct ModifyTableState
 | 
			
		||||
 *		whichplan		which plan is being executed (0 .. n-1)
 | 
			
		||||
 * ----------------
 | 
			
		||||
 */
 | 
			
		||||
typedef struct AppendState
 | 
			
		||||
 | 
			
		||||
struct AppendState;
 | 
			
		||||
typedef struct AppendState AppendState;
 | 
			
		||||
struct ParallelAppendState;
 | 
			
		||||
typedef struct ParallelAppendState ParallelAppendState;
 | 
			
		||||
 | 
			
		||||
struct AppendState
 | 
			
		||||
{
 | 
			
		||||
	PlanState	ps;				/* its first field is NodeTag */
 | 
			
		||||
	PlanState **appendplans;	/* array of PlanStates for my inputs */
 | 
			
		||||
	int			as_nplans;
 | 
			
		||||
	int			as_whichplan;
 | 
			
		||||
} AppendState;
 | 
			
		||||
	ParallelAppendState *as_pstate; /* parallel coordination info */
 | 
			
		||||
	Size		pstate_len;		/* size of parallel coordination info */
 | 
			
		||||
	bool		(*choose_next_subplan) (AppendState *);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* ----------------
 | 
			
		||||
 *	 MergeAppendState information
 | 
			
		||||
 
 | 
			
		||||
@@ -269,6 +269,9 @@ extern void list_free_deep(List *list);
 | 
			
		||||
extern List *list_copy(const List *list);
 | 
			
		||||
extern List *list_copy_tail(const List *list, int nskip);
 | 
			
		||||
 | 
			
		||||
typedef int (*list_qsort_comparator) (const void *a, const void *b);
 | 
			
		||||
extern List *list_qsort(const List *list, list_qsort_comparator cmp);
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * To ease migration to the new list API, a set of compatibility
 | 
			
		||||
 * macros are provided that reduce the impact of the list API changes
 | 
			
		||||
 
 | 
			
		||||
@@ -248,6 +248,7 @@ typedef struct Append
 | 
			
		||||
	/* RT indexes of non-leaf tables in a partition tree */
 | 
			
		||||
	List	   *partitioned_rels;
 | 
			
		||||
	List	   *appendplans;
 | 
			
		||||
	int			first_partial_plan;
 | 
			
		||||
} Append;
 | 
			
		||||
 | 
			
		||||
/* ----------------
 | 
			
		||||
 
 | 
			
		||||
@@ -1255,6 +1255,9 @@ typedef struct CustomPath
 | 
			
		||||
 * AppendPath represents an Append plan, ie, successive execution of
 | 
			
		||||
 * several member plans.
 | 
			
		||||
 *
 | 
			
		||||
 * For partial Append, 'subpaths' contains non-partial subpaths followed by
 | 
			
		||||
 * partial subpaths.
 | 
			
		||||
 *
 | 
			
		||||
 * Note: it is possible for "subpaths" to contain only one, or even no,
 | 
			
		||||
 * elements.  These cases are optimized during create_append_plan.
 | 
			
		||||
 * In particular, an AppendPath with no subpaths is a "dummy" path that
 | 
			
		||||
@@ -1266,6 +1269,9 @@ typedef struct AppendPath
 | 
			
		||||
	/* RT indexes of non-leaf tables in a partition tree */
 | 
			
		||||
	List	   *partitioned_rels;
 | 
			
		||||
	List	   *subpaths;		/* list of component Paths */
 | 
			
		||||
 | 
			
		||||
	/* Index of first partial path in subpaths */
 | 
			
		||||
	int			first_partial_path;
 | 
			
		||||
} AppendPath;
 | 
			
		||||
 | 
			
		||||
#define IS_DUMMY_PATH(p) \
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user