diff --git a/src/backend/commands/explain.c b/src/backend/commands/explain.c index 713cd0e..379fc5c 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 3f0ed69..3834ed6 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 dbec07e..ee4e189 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;