mirror of
https://github.com/postgres/postgres.git
synced 2025-12-07 12:02:30 +03:00
Adjust definition of cheapest_total_path to work better with LATERAL.
In the initial cut at LATERAL, I kept the rule that cheapest_total_path was always unparameterized, which meant it had to be NULL if the relation has no unparameterized paths. It turns out to work much more nicely if we always have *some* path nominated as cheapest-total for each relation. In particular, let's still say it's the cheapest unparameterized path if there is one; if not, take the cheapest-total-cost path among those of the minimum available parameterization. (The first rule is actually a special case of the second.) This allows reversion of some temporary lobotomizations I'd put in place. In particular, the planner can now consider hash and merge joins for joins below a parameter-supplying nestloop, even if there aren't any unparameterized paths available. This should bring planning of LATERAL-containing queries to the same level as queries not using that feature. Along the way, simplify management of parameterized paths in add_path() and friends. In the original coding for parameterized paths in 9.2, I tried to minimize the logic changes in add_path(), so it just treated parameterization as yet another dimension of comparison for paths. We later made it ignore pathkeys (sort ordering) of parameterized paths, on the grounds that ordering isn't a useful property for the path on the inside of a nestloop, so we might as well get rid of useless parameterized paths as quickly as possible. But we didn't take that reasoning as far as we should have. Startup cost isn't a useful property inside a nestloop either, so add_path() ought to discount startup cost of parameterized paths as well. Having done that, the secondary sorting I'd implemented (in add_parameterized_path) is no longer needed --- any parameterized path that survives add_path() at all is worth considering at higher levels. So this should be a bit faster as well as simpler.
This commit is contained in:
@@ -102,18 +102,12 @@ geqo_eval(PlannerInfo *root, Gene *tour, int num_gene)
|
||||
joinrel = gimme_tree(root, tour, num_gene);
|
||||
best_path = joinrel->cheapest_total_path;
|
||||
|
||||
/*
|
||||
* If no unparameterized path, use the cheapest parameterized path for
|
||||
* costing purposes. XXX revisit this after LATERAL dust settles
|
||||
*/
|
||||
if (!best_path)
|
||||
best_path = linitial(joinrel->cheapest_parameterized_paths);
|
||||
|
||||
/*
|
||||
* compute fitness
|
||||
*
|
||||
* XXX geqo does not currently support optimization for partial result
|
||||
* retrieval --- how to fix?
|
||||
* retrieval, nor do we take any cognizance of possible use of
|
||||
* parameterized paths --- how to fix?
|
||||
*/
|
||||
fitness = best_path->total_cost;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user