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.
This commit is contained in:
parent
b31875b1fe
commit
69995c3b3f
@ -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.
|
||||||
*/
|
*/
|
||||||
|
if (((HashPath *) path)->num_batches == 1)
|
||||||
|
{
|
||||||
|
/* Startup cost is exactly the cost of hash table building */
|
||||||
*rescan_startup_cost = 0;
|
*rescan_startup_cost = 0;
|
||||||
*rescan_total_cost = path->total_cost - path->startup_cost;
|
*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:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user