mirror of
https://github.com/postgres/postgres.git
synced 2025-07-09 22:41:56 +03:00
Make sequential scans parallel-aware.
In addition, this path fills in a number of missing bits and pieces in the parallel infrastructure. Paths and plans now have a parallel_aware flag indicating whether whatever parallel-aware logic they have should be engaged. It is believed that we will need this flag for a number of path/plan types, not just sequential scans, which is why the flag is generic rather than part of the SeqScan structures specifically. Also, execParallel.c now gives parallel nodes a chance to initialize their PlanState nodes from the DSM during parallel worker startup. Amit Kapila, with a fair amount of adjustment by me. Review of previous patch versions by Haribabu Kommi and others.
This commit is contained in:
@ -25,6 +25,7 @@
|
||||
|
||||
#include "executor/execParallel.h"
|
||||
#include "executor/executor.h"
|
||||
#include "executor/nodeSeqscan.h"
|
||||
#include "executor/tqueue.h"
|
||||
#include "nodes/nodeFuncs.h"
|
||||
#include "optimizer/planmain.h"
|
||||
@ -167,10 +168,16 @@ ExecParallelEstimate(PlanState *planstate, ExecParallelEstimateContext *e)
|
||||
/* Count this node. */
|
||||
e->nnodes++;
|
||||
|
||||
/*
|
||||
* XXX. Call estimators for parallel-aware nodes here, when we have
|
||||
* some.
|
||||
*/
|
||||
/* Call estimators for parallel-aware nodes. */
|
||||
switch (nodeTag(planstate))
|
||||
{
|
||||
case T_SeqScanState:
|
||||
ExecSeqScanEstimate((SeqScanState *) planstate,
|
||||
e->pcxt);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return planstate_tree_walker(planstate, ExecParallelEstimate, e);
|
||||
}
|
||||
@ -205,10 +212,16 @@ ExecParallelInitializeDSM(PlanState *planstate,
|
||||
/* Count this node. */
|
||||
d->nnodes++;
|
||||
|
||||
/*
|
||||
* XXX. Call initializers for parallel-aware plan nodes, when we have
|
||||
* some.
|
||||
*/
|
||||
/* Call initializers for parallel-aware plan nodes. */
|
||||
switch (nodeTag(planstate))
|
||||
{
|
||||
case T_SeqScanState:
|
||||
ExecSeqScanInitializeDSM((SeqScanState *) planstate,
|
||||
d->pcxt);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return planstate_tree_walker(planstate, ExecParallelInitializeDSM, d);
|
||||
}
|
||||
@ -574,6 +587,30 @@ ExecParallelReportInstrumentation(PlanState *planstate,
|
||||
instrumentation);
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize the PlanState and its descendents with the information
|
||||
* retrieved from shared memory. This has to be done once the PlanState
|
||||
* is allocated and initialized by executor; that is, after ExecutorStart().
|
||||
*/
|
||||
static bool
|
||||
ExecParallelInitializeWorker(PlanState *planstate, shm_toc *toc)
|
||||
{
|
||||
if (planstate == NULL)
|
||||
return false;
|
||||
|
||||
/* Call initializers for parallel-aware plan nodes. */
|
||||
switch (nodeTag(planstate))
|
||||
{
|
||||
case T_SeqScanState:
|
||||
ExecSeqScanInitializeWorker((SeqScanState *) planstate, toc);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return planstate_tree_walker(planstate, ExecParallelInitializeWorker, toc);
|
||||
}
|
||||
|
||||
/*
|
||||
* Main entrypoint for parallel query worker processes.
|
||||
*
|
||||
@ -610,6 +647,7 @@ ParallelQueryMain(dsm_segment *seg, shm_toc *toc)
|
||||
|
||||
/* Start up the executor, have it run the plan, and then shut it down. */
|
||||
ExecutorStart(queryDesc, 0);
|
||||
ExecParallelInitializeWorker(queryDesc->planstate, toc);
|
||||
ExecutorRun(queryDesc, ForwardScanDirection, 0L);
|
||||
ExecutorFinish(queryDesc);
|
||||
|
||||
|
Reference in New Issue
Block a user