Code review for Parallel Append.
authorRobert Haas <rhaas@postgresql.org>
Thu, 4 Jan 2018 12:56:09 +0000 (07:56 -0500)
committerRobert Haas <rhaas@postgresql.org>
Thu, 4 Jan 2018 12:56:09 +0000 (07:56 -0500)
- Remove unnecessary #include mistakenly added in execnodes.h.
- Fix mistake in comment in choose_next_subplan_for_leader.
- Adjust row estimates in cost_append for a possibly-different
  parallel divisor.
- Clamp row estimates in cost_append after operations that may
  not produce integers.

Amit Kapila, with cosmetic adjustments by me.

Discussion: http://postgr.es/m/CAA4eK1+qcbeai3coPpRW=GFCzFeLUsuY4T-AKHqMjxpEGZBPQg@mail.gmail.com

src/backend/executor/nodeAppend.c
src/backend/optimizer/path/costsize.c
src/include/nodes/execnodes.h

index 4245d8afafe7a298060476214019b2cb6eb2038f..64a17fb03271ac72f8bcbaedb54ccbf12225230b 100644 (file)
@@ -446,10 +446,9 @@ choose_next_subplan_for_leader(AppendState *node)
  *
  *     We start from the first plan and advance through the list;
  *     when we get back to the end, we loop back to the first
- *     nonpartial plan.  This assigns the non-partial plans first
- *     in order of descending cost and then spreads out the
- *     workers as evenly as possible across the remaining partial
- *     plans.
+ *     partial plan.  This assigns the non-partial plans first in
+ *     order of descending cost and then spreads out the workers
+ *     as evenly as possible across the remaining partial plans.
  * ----------------------------------------------------------------
  */
 static bool
index 7903b2cb16727381c6ecc0f56038e1f6eba6cb8d..8679b14b29ab89ef5483c663cef6466caa910a8b 100644 (file)
@@ -1883,18 +1883,26 @@ cost_append(AppendPath *apath)
                                               subpath->startup_cost);
 
            /*
-            * Apply parallel divisor to non-partial subpaths.  Also add the
-            * cost of partial paths to the total cost, but ignore non-partial
-            * paths for now.
+            * Apply parallel divisor to subpaths.  Scale the number of rows
+            * for each partial subpath based on the ratio of the parallel
+            * divisor originally used for the subpath to the one we adopted.
+            * Also add the cost of partial paths to the total cost, but
+            * ignore non-partial paths for now.
             */
            if (i < apath->first_partial_path)
                apath->path.rows += subpath->rows / parallel_divisor;
            else
            {
-               apath->path.rows += subpath->rows;
+               double      subpath_parallel_divisor;
+
+               subpath_parallel_divisor = get_parallel_divisor(subpath);
+               apath->path.rows += subpath->rows * (subpath_parallel_divisor /
+                                                    parallel_divisor);
                apath->path.total_cost += subpath->total_cost;
            }
 
+           apath->path.rows = clamp_row_est(apath->path.rows);
+
            i++;
        }
 
index b121e16688108c5b8c2feed43e7a951f185012e2..3ad58cdfe7c05786ada584b4902126e9dc6f16c4 100644 (file)
@@ -21,7 +21,6 @@
 #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"