mirror of
https://github.com/postgres/postgres.git
synced 2025-09-03 15:22:11 +03:00
Fix optimizer and make faster.
This commit is contained in:
@@ -7,7 +7,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/optimizer/path/Attic/prune.c,v 1.27 1999/02/11 14:58:54 momjian Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/optimizer/path/Attic/prune.c,v 1.28 1999/02/12 05:56:51 momjian Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@@ -77,42 +77,28 @@ prune_joinrel(RelOptInfo *rel, List *other_rels)
|
||||
rel->pathlist,
|
||||
other_rel->pathlist);
|
||||
else
|
||||
result = nconc(result, lcons(other_rel, NIL));
|
||||
result = lappend(result, other_rel);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/*
|
||||
* prune-rel-paths--
|
||||
* rels-set-cheapest
|
||||
* For each relation entry in 'rel-list' (which corresponds to a join
|
||||
* relation), set pointers to the unordered path and cheapest paths
|
||||
* (if the unordered path isn't the cheapest, it is pruned), and
|
||||
* reset the relation's size field to reflect the join.
|
||||
*
|
||||
* Returns nothing of interest.
|
||||
*
|
||||
* relation), set pointers to the cheapest path
|
||||
*/
|
||||
void
|
||||
prune_rel_paths(List *rel_list)
|
||||
rels_set_cheapest(List *rel_list)
|
||||
{
|
||||
List *x = NIL;
|
||||
List *y = NIL;
|
||||
Path *path = NULL;
|
||||
RelOptInfo *rel = (RelOptInfo *) NULL;
|
||||
JoinPath *cheapest = (JoinPath *) NULL;
|
||||
JoinPath *cheapest;
|
||||
|
||||
foreach(x, rel_list)
|
||||
{
|
||||
rel = (RelOptInfo *) lfirst(x);
|
||||
rel->size = 0;
|
||||
foreach(y, rel->pathlist)
|
||||
{
|
||||
path = (Path *) lfirst(y);
|
||||
|
||||
if (!path->pathorder->ord.sortop)
|
||||
break;
|
||||
}
|
||||
cheapest = (JoinPath *) prune_rel_path(rel, path);
|
||||
cheapest = (JoinPath *) set_cheapest(rel, rel->pathlist);
|
||||
if (IsA_JoinPath(cheapest))
|
||||
rel->size = compute_joinrel_size(cheapest);
|
||||
else
|
||||
@@ -121,33 +107,6 @@ prune_rel_paths(List *rel_list)
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* prune-rel-path--
|
||||
* Compares the unordered path for a relation with the cheapest path. If
|
||||
* the unordered path is not cheapest, it is pruned.
|
||||
*
|
||||
* Resets the pointers in 'rel' for unordered and cheapest paths.
|
||||
*
|
||||
* Returns the cheapest path.
|
||||
*
|
||||
*/
|
||||
Path *
|
||||
prune_rel_path(RelOptInfo *rel, Path *unorderedpath)
|
||||
{
|
||||
Path *cheapest = set_cheapest(rel, rel->pathlist);
|
||||
|
||||
/* don't prune if not pruneable -- JMH, 11/23/92 */
|
||||
if (unorderedpath != cheapest && rel->pruneable)
|
||||
{
|
||||
rel->unorderedpath = (Path *) NULL;
|
||||
rel->pathlist = lremove(unorderedpath, rel->pathlist);
|
||||
}
|
||||
else
|
||||
rel->unorderedpath = (Path *) unorderedpath;
|
||||
|
||||
return cheapest;
|
||||
}
|
||||
|
||||
/*
|
||||
* merge-joinrels--
|
||||
* Given two lists of rel nodes that are already
|
||||
|
Reference in New Issue
Block a user