diff --git a/src/backend/commands/explain.c b/src/backend/commands/explain.c
index 713cd0e3da8abbc1442c5357e76ee0fde8a1b499..379fc5c429e1607ba2b777f2a80240634aca99c9 100644
--- a/src/backend/commands/explain.c
+++ b/src/backend/commands/explain.c
@@ -1339,8 +1339,16 @@ ExplainNode(PlanState *planstate, List *ancestors,
 				if (plan->qual)
 					show_instrumentation_count("Rows Removed by Filter", 1,
 											   planstate, es);
-				ExplainPropertyInteger("Number of Workers",
+				ExplainPropertyInteger("Workers Planned",
 									   gather->num_workers, es);
+				if (es->analyze)
+				{
+					int			nworkers;
+
+					nworkers = ((GatherState *) planstate)->nworkers_launched;
+					ExplainPropertyInteger("Workers Launched",
+										   nworkers, es);
+				}
 				if (gather->single_copy)
 					ExplainPropertyText("Single Copy",
 									  gather->single_copy ? "true" : "false",
diff --git a/src/backend/executor/nodeGather.c b/src/backend/executor/nodeGather.c
index 3f0ed6963277bf5e8ef438580e2b4835c95c597d..3834ed678cb650fca7f6403d7399798ae45c3091 100644
--- a/src/backend/executor/nodeGather.c
+++ b/src/backend/executor/nodeGather.c
@@ -166,6 +166,7 @@ ExecGather(GatherState *node)
 			 */
 			pcxt = node->pei->pcxt;
 			LaunchParallelWorkers(pcxt);
+			node->nworkers_launched = pcxt->nworkers_launched;
 
 			/* Set up tuple queue readers to read the results. */
 			if (pcxt->nworkers_launched > 0)
diff --git a/src/include/nodes/execnodes.h b/src/include/nodes/execnodes.h
index dbec07e5a375cbf235feddf5dc6c8120f23bb53f..ee4e189689348fbe317d6a8910edffbbe5ec00ab 100644
--- a/src/include/nodes/execnodes.h
+++ b/src/include/nodes/execnodes.h
@@ -1956,6 +1956,7 @@ typedef struct GatherState
 	struct ParallelExecutorInfo *pei;
 	int			nreaders;
 	int			nextreader;
+	int			nworkers_launched;
 	struct TupleQueueReader **reader;
 	TupleTableSlot *funnel_slot;
 	bool		need_to_scan_locally;