mirror of
https://github.com/postgres/postgres.git
synced 2025-09-03 15:22:11 +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:
@@ -309,18 +309,16 @@ typedef struct PlannerInfo
|
||||
* method of generating the relation
|
||||
* ppilist - ParamPathInfo nodes for parameterized Paths, if any
|
||||
* cheapest_startup_path - the pathlist member with lowest startup cost
|
||||
* (regardless of its ordering; but must be
|
||||
* unparameterized; hence will be NULL for
|
||||
* a LATERAL subquery)
|
||||
* (regardless of ordering) among the unparameterized paths;
|
||||
* or NULL if there is no unparameterized path
|
||||
* cheapest_total_path - the pathlist member with lowest total cost
|
||||
* (regardless of its ordering; but must be
|
||||
* unparameterized; hence will be NULL for
|
||||
* a LATERAL subquery)
|
||||
* (regardless of ordering) among the unparameterized paths;
|
||||
* or if there is no unparameterized path, the path with lowest
|
||||
* total cost among the paths with minimum parameterization
|
||||
* cheapest_unique_path - for caching cheapest path to produce unique
|
||||
* (no duplicates) output from relation
|
||||
* cheapest_parameterized_paths - paths with cheapest total costs for
|
||||
* their parameterizations; always includes
|
||||
* cheapest_total_path, if that exists
|
||||
* (no duplicates) output from relation; NULL if not yet requested
|
||||
* cheapest_parameterized_paths - best paths for their parameterizations;
|
||||
* always includes cheapest_total_path, even if that's unparameterized
|
||||
*
|
||||
* If the relation is a base relation it will have these fields set:
|
||||
*
|
||||
|
Reference in New Issue
Block a user