Fix costing of parallel hash joins.
authorPeter Eisentraut <peter_e@gmx.net>
Wed, 7 Mar 2018 02:54:37 +0000 (21:54 -0500)
committerPeter Eisentraut <peter_e@gmx.net>
Wed, 7 Mar 2018 02:54:37 +0000 (21:54 -0500)
Commit 1804284042e659e7d16904e7bbb0ad546394b6a3 established that single-batch
parallel-aware hash joins could create one large shared hash table using the
combined work_mem budget of all participants.  The costing accidentally
assumed that parallel-oblivious hash joins could also do that.  The
documentation for initial_cost_hashjoin() also failed to mention the new
argument.  Repair.

Author: Thomas Munro
Reported-By: Antonin Houska
Reviewed-By: Antonin Houska
Discussion: https://postgr.es/m/12441.1513935950%40localhost

src/backend/optimizer/path/costsize.c
src/backend/optimizer/path/joinpath.c

index d8db0b29e1f97394bd6ef4a0de4ad3eb1ea2e2e4..36b3dfabb80b944cd18f64f5c41a62c68ea9fda9 100644 (file)
@@ -3143,6 +3143,8 @@ cached_scansel(PlannerInfo *root, RestrictInfo *rinfo, PathKey *pathkey)
  * 'outer_path' is the outer input to the join
  * 'inner_path' is the inner input to the join
  * 'extra' contains miscellaneous information about the join
+ * 'parallel_hash' indicates that inner_path is partial and that a shared
+ *     hash table will be built in parallel
  */
 void
 initial_cost_hashjoin(PlannerInfo *root, JoinCostWorkspace *workspace,
index 688f440b92ea059c56fad3c1f93f2250cf18a41d..3fd3cc7670b0215c4d76fcf9523a5ca14735e01e 100644 (file)
@@ -814,7 +814,7 @@ try_partial_hashjoin_path(PlannerInfo *root,
     * cost.  Bail out right away if it looks terrible.
     */
    initial_cost_hashjoin(root, &workspace, jointype, hashclauses,
-                         outer_path, inner_path, extra, true);
+                         outer_path, inner_path, extra, parallel_hash);
    if (!add_partial_path_precheck(joinrel, workspace.total_cost, NIL))
        return;