Commit 69995c3b authored by Tom Lane's avatar Tom Lane

Fix cost_rescan() to account for multi-batch hashing correctly.

cost_rescan assumed that we don't need to rebuild the hash table when
rescanning a hash join.  However, that's currently only true for
single-batch joins; for a multi-batch join we must charge full freight.

This probably has escaped notice because we'd be unlikely to put a hash
join on the inside of a nestloop anyway.  Nonetheless, it's wrong.
Fix in HEAD, but don't backpatch for fear of destabilizing plans in
stable releases.
parent b31875b1
...@@ -3114,11 +3114,21 @@ cost_rescan(PlannerInfo *root, Path *path, ...@@ -3114,11 +3114,21 @@ cost_rescan(PlannerInfo *root, Path *path,
case T_HashJoin: case T_HashJoin:
/* /*
* Assume that all of the startup cost represents hash table * If it's a single-batch join, we don't need to rebuild the hash
* building, which we won't have to do over. * table during a rescan.
*/ */
*rescan_startup_cost = 0; if (((HashPath *) path)->num_batches == 1)
*rescan_total_cost = path->total_cost - path->startup_cost; {
/* Startup cost is exactly the cost of hash table building */
*rescan_startup_cost = 0;
*rescan_total_cost = path->total_cost - path->startup_cost;
}
else
{
/* Otherwise, no special treatment */
*rescan_startup_cost = path->startup_cost;
*rescan_total_cost = path->total_cost;
}
break; break;
case T_CteScan: case T_CteScan:
case T_WorkTableScan: case T_WorkTableScan:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment