mirror of
https://github.com/postgres/postgres.git
synced 2025-11-21 00:42:43 +03:00
Remove grotty use of disable_cost for TID scan plans.
Previously, the code charged disable_cost for CurrentOfExpr, and then subtracted disable_cost from the cost of a TID path that used CurrentOfExpr as the TID qual, effectively disabling all paths except that one. Now, we instead suppress generation of the disabled paths entirely, and generate only the one that the executor will actually understand. With this approach, we do not need to rely on disable_cost being large enough to prevent the wrong path from being chosen, and we save some CPU cycle by avoiding generating paths that we can't actually use. In my opinion, the code is also easier to understand like this. Patch by me. Review by Heikki Linnakangas. Discussion: http://postgr.es/m/591b3596-2ea0-4b8e-99c6-fad0ef2801f5@iki.fi
This commit is contained in:
@@ -1251,7 +1251,6 @@ cost_tidscan(Path *path, PlannerInfo *root,
|
||||
{
|
||||
Cost startup_cost = 0;
|
||||
Cost run_cost = 0;
|
||||
bool isCurrentOf = false;
|
||||
QualCost qpqual_cost;
|
||||
Cost cpu_per_tuple;
|
||||
QualCost tid_qual_cost;
|
||||
@@ -1287,7 +1286,6 @@ cost_tidscan(Path *path, PlannerInfo *root,
|
||||
else if (IsA(qual, CurrentOfExpr))
|
||||
{
|
||||
/* CURRENT OF yields 1 tuple */
|
||||
isCurrentOf = true;
|
||||
ntuples++;
|
||||
}
|
||||
else
|
||||
@@ -1297,22 +1295,6 @@ cost_tidscan(Path *path, PlannerInfo *root,
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* We must force TID scan for WHERE CURRENT OF, because only nodeTidscan.c
|
||||
* understands how to do it correctly. Therefore, honor enable_tidscan
|
||||
* only when CURRENT OF isn't present. Also note that cost_qual_eval
|
||||
* counts a CurrentOfExpr as having startup cost disable_cost, which we
|
||||
* subtract off here; that's to prevent other plan types such as seqscan
|
||||
* from winning.
|
||||
*/
|
||||
if (isCurrentOf)
|
||||
{
|
||||
Assert(baserel->baserestrictcost.startup >= disable_cost);
|
||||
startup_cost -= disable_cost;
|
||||
}
|
||||
else if (!enable_tidscan)
|
||||
startup_cost += disable_cost;
|
||||
|
||||
/*
|
||||
* The TID qual expressions will be computed once, any other baserestrict
|
||||
* quals once per retrieved tuple.
|
||||
@@ -1399,9 +1381,6 @@ cost_tidrangescan(Path *path, PlannerInfo *root,
|
||||
ntuples = selectivity * baserel->tuples;
|
||||
nseqpages = pages - 1.0;
|
||||
|
||||
if (!enable_tidscan)
|
||||
startup_cost += disable_cost;
|
||||
|
||||
/*
|
||||
* The TID qual expressions will be computed once, any other baserestrict
|
||||
* quals once per retrieved tuple.
|
||||
@@ -4884,11 +4863,6 @@ cost_qual_eval_walker(Node *node, cost_qual_eval_context *context)
|
||||
/* Treat all these as having cost 1 */
|
||||
context->total.per_tuple += cpu_operator_cost;
|
||||
}
|
||||
else if (IsA(node, CurrentOfExpr))
|
||||
{
|
||||
/* Report high cost to prevent selection of anything but TID scan */
|
||||
context->total.startup += disable_cost;
|
||||
}
|
||||
else if (IsA(node, SubLink))
|
||||
{
|
||||
/* This routine should not be applied to un-planned expressions */
|
||||
|
||||
Reference in New Issue
Block a user