mirror of
				https://github.com/postgres/postgres.git
				synced 2025-11-03 09:13:20 +03:00 
			
		
		
		
	Invent min_parallel_relation_size GUC to replace a hard-wired constant.
The main point of doing this is to allow the cutoff to be set very small, even zero, to allow parallel-query behavior to be tested on relatively small tables such as we typically use in the regression tests. But it might be of use to users too. The number-of-workers scaling behavior in create_plain_partial_paths() is pretty ad-hoc and subject to change, so we won't expose anything about that, but the notion of not considering parallel query at all for tables below size X seems reasonably stable. Amit Kapila, per a suggestion from me Discussion: <17170.1465830165@sss.pgh.pa.us>
This commit is contained in:
		@@ -3699,6 +3699,20 @@ include_dir 'conf.d'
 | 
				
			|||||||
      </listitem>
 | 
					      </listitem>
 | 
				
			||||||
     </varlistentry>
 | 
					     </varlistentry>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					     <varlistentry id="guc-min-parallel-relation-size" xreflabel="min_parallel_relation_size">
 | 
				
			||||||
 | 
					      <term><varname>min_parallel_relation_size</varname> (<type>integer</type>)
 | 
				
			||||||
 | 
					      <indexterm>
 | 
				
			||||||
 | 
					       <primary><varname>min_parallel_relation_size</> configuration parameter</primary>
 | 
				
			||||||
 | 
					      </indexterm>
 | 
				
			||||||
 | 
					      </term>
 | 
				
			||||||
 | 
					      <listitem>
 | 
				
			||||||
 | 
					       <para>
 | 
				
			||||||
 | 
					        Sets the minimum size of relations to be considered for parallel scan.
 | 
				
			||||||
 | 
					        The default is 8 megabytes (<literal>8MB</>).
 | 
				
			||||||
 | 
					       </para>
 | 
				
			||||||
 | 
					      </listitem>
 | 
				
			||||||
 | 
					     </varlistentry>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
     <varlistentry id="guc-effective-cache-size" xreflabel="effective_cache_size">
 | 
					     <varlistentry id="guc-effective-cache-size" xreflabel="effective_cache_size">
 | 
				
			||||||
      <term><varname>effective_cache_size</varname> (<type>integer</type>)
 | 
					      <term><varname>effective_cache_size</varname> (<type>integer</type>)
 | 
				
			||||||
      <indexterm>
 | 
					      <indexterm>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,6 +15,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include "postgres.h"
 | 
					#include "postgres.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <limits.h>
 | 
				
			||||||
#include <math.h>
 | 
					#include <math.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "access/sysattr.h"
 | 
					#include "access/sysattr.h"
 | 
				
			||||||
@@ -56,6 +57,7 @@ typedef struct pushdown_safety_info
 | 
				
			|||||||
/* These parameters are set by GUC */
 | 
					/* These parameters are set by GUC */
 | 
				
			||||||
bool		enable_geqo = false;	/* just in case GUC doesn't set it */
 | 
					bool		enable_geqo = false;	/* just in case GUC doesn't set it */
 | 
				
			||||||
int			geqo_threshold;
 | 
					int			geqo_threshold;
 | 
				
			||||||
 | 
					int			min_parallel_relation_size;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Hook for plugins to get control in set_rel_pathlist() */
 | 
					/* Hook for plugins to get control in set_rel_pathlist() */
 | 
				
			||||||
set_rel_pathlist_hook_type set_rel_pathlist_hook = NULL;
 | 
					set_rel_pathlist_hook_type set_rel_pathlist_hook = NULL;
 | 
				
			||||||
@@ -690,7 +692,7 @@ create_plain_partial_paths(PlannerInfo *root, RelOptInfo *rel)
 | 
				
			|||||||
		parallel_workers = rel->rel_parallel_workers;
 | 
							parallel_workers = rel->rel_parallel_workers;
 | 
				
			||||||
	else
 | 
						else
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		int			parallel_threshold = 1000;
 | 
							int			parallel_threshold;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/*
 | 
							/*
 | 
				
			||||||
		 * If this relation is too small to be worth a parallel scan, just
 | 
							 * If this relation is too small to be worth a parallel scan, just
 | 
				
			||||||
@@ -699,21 +701,24 @@ create_plain_partial_paths(PlannerInfo *root, RelOptInfo *rel)
 | 
				
			|||||||
		 * might not be worthwhile just for this relation, but when combined
 | 
							 * might not be worthwhile just for this relation, but when combined
 | 
				
			||||||
		 * with all of its inheritance siblings it may well pay off.
 | 
							 * with all of its inheritance siblings it may well pay off.
 | 
				
			||||||
		 */
 | 
							 */
 | 
				
			||||||
		if (rel->pages < parallel_threshold &&
 | 
							if (rel->pages < (BlockNumber) min_parallel_relation_size &&
 | 
				
			||||||
			rel->reloptkind == RELOPT_BASEREL)
 | 
								rel->reloptkind == RELOPT_BASEREL)
 | 
				
			||||||
			return;
 | 
								return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/*
 | 
							/*
 | 
				
			||||||
		 * Select the number of workers based on the log of the size of the
 | 
							 * Select the number of workers based on the log of the size of the
 | 
				
			||||||
		 * relation.  This probably needs to be a good deal more
 | 
							 * relation.  This probably needs to be a good deal more
 | 
				
			||||||
		 * sophisticated, but we need something here for now.
 | 
							 * sophisticated, but we need something here for now.  Note that the
 | 
				
			||||||
 | 
							 * upper limit of the min_parallel_relation_size GUC is chosen to
 | 
				
			||||||
 | 
							 * prevent overflow here.
 | 
				
			||||||
		 */
 | 
							 */
 | 
				
			||||||
		parallel_workers = 1;
 | 
							parallel_workers = 1;
 | 
				
			||||||
		while (rel->pages > parallel_threshold * 3)
 | 
							parallel_threshold = Max(min_parallel_relation_size, 1);
 | 
				
			||||||
 | 
							while (rel->pages >= (BlockNumber) (parallel_threshold * 3))
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			parallel_workers++;
 | 
								parallel_workers++;
 | 
				
			||||||
			parallel_threshold *= 3;
 | 
								parallel_threshold *= 3;
 | 
				
			||||||
			if (parallel_threshold >= PG_INT32_MAX / 3)
 | 
								if (parallel_threshold > INT_MAX / 3)
 | 
				
			||||||
				break;			/* avoid overflow */
 | 
									break;			/* avoid overflow */
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2747,6 +2747,17 @@ static struct config_int ConfigureNamesInt[] =
 | 
				
			|||||||
		NULL, NULL, NULL
 | 
							NULL, NULL, NULL
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							{"min_parallel_relation_size", PGC_USERSET, QUERY_TUNING_COST,
 | 
				
			||||||
 | 
								gettext_noop("Sets the minimum size of relations to be considered for parallel scan."),
 | 
				
			||||||
 | 
								NULL,
 | 
				
			||||||
 | 
								GUC_UNIT_BLOCKS,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							&min_parallel_relation_size,
 | 
				
			||||||
 | 
							1024, 0, INT_MAX / 3,
 | 
				
			||||||
 | 
							NULL, NULL, NULL
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		/* Can't be set in postgresql.conf */
 | 
							/* Can't be set in postgresql.conf */
 | 
				
			||||||
		{"server_version_num", PGC_INTERNAL, PRESET_OPTIONS,
 | 
							{"server_version_num", PGC_INTERNAL, PRESET_OPTIONS,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -304,6 +304,7 @@
 | 
				
			|||||||
#cpu_operator_cost = 0.0025		# same scale as above
 | 
					#cpu_operator_cost = 0.0025		# same scale as above
 | 
				
			||||||
#parallel_tuple_cost = 0.1		# same scale as above
 | 
					#parallel_tuple_cost = 0.1		# same scale as above
 | 
				
			||||||
#parallel_setup_cost = 1000.0	# same scale as above
 | 
					#parallel_setup_cost = 1000.0	# same scale as above
 | 
				
			||||||
 | 
					#min_parallel_relation_size = 8MB
 | 
				
			||||||
#effective_cache_size = 4GB
 | 
					#effective_cache_size = 4GB
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# - Genetic Query Optimizer -
 | 
					# - Genetic Query Optimizer -
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -22,6 +22,7 @@
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
extern bool enable_geqo;
 | 
					extern bool enable_geqo;
 | 
				
			||||||
extern int	geqo_threshold;
 | 
					extern int	geqo_threshold;
 | 
				
			||||||
 | 
					extern int	min_parallel_relation_size;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Hook for plugins to get control in set_rel_pathlist() */
 | 
					/* Hook for plugins to get control in set_rel_pathlist() */
 | 
				
			||||||
typedef void (*set_rel_pathlist_hook_type) (PlannerInfo *root,
 | 
					typedef void (*set_rel_pathlist_hook_type) (PlannerInfo *root,
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user