1
0
mirror of https://github.com/postgres/postgres.git synced 2025-11-15 03:41:20 +03:00

optimizer cleanup

This commit is contained in:
Bruce Momjian
1999-02-19 05:18:06 +00:00
parent 8ab72a38df
commit 612b8434e4
4 changed files with 46 additions and 55 deletions

View File

@@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/optimizer/path/joinpath.c,v 1.29 1999/02/18 19:58:52 momjian Exp $
* $Header: /cvsroot/pgsql/src/backend/optimizer/path/joinpath.c,v 1.30 1999/02/19 05:18:04 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -79,8 +79,8 @@ update_rels_pathlist_for_joins(Query *root, List *joinrels)
List *pathlist = NIL;
/* flatten out relids later in this function */
innerrelids = lsecond(joinrel->relids);
outerrelids = lfirst(joinrel->relids);
innerrelids = lsecond(joinrel->relids);
/*
* base relation id is an integer and join relation relid is a
@@ -123,7 +123,7 @@ update_rels_pathlist_for_joins(Query *root, List *joinrels)
outerrel,
innerrel,
outerrel->pathlist,
(Path *) innerrel->cheapestpath,
innerrel->cheapestpath,
bestinnerjoin,
mergeinfo_list));
@@ -176,7 +176,6 @@ best_innerjoin(List *join_paths, Relids outer_relids)
&& ((cheapest == NULL ||
path_is_cheaper((Path *) lfirst(join_path), cheapest))))
{
cheapest = (Path *) lfirst(join_path);
}
}
@@ -293,7 +292,7 @@ match_unsorted_outer(RelOptInfo *joinrel,
List *clauses = NIL;
List *matchedJoinKeys = NIL;
List *matchedJoinClauses = NIL;
MergeInfo *xmergeinfo = (MergeInfo *) NULL;
MergeInfo *xmergeinfo = NULL;
outerpath = (Path *) lfirst(i);
@@ -309,9 +308,8 @@ match_unsorted_outer(RelOptInfo *joinrel,
if (clauses)
{
List *jmkeys = xmergeinfo->jmethod.jmkeys;
List *clauses = xmergeinfo->jmethod.clauses;
matchedJoinKeys = match_pathkeys_joinkeys(outerpath->pathkeys,
matchedJoinKeys = order_joinkeys_by_pathkeys(outerpath->pathkeys,
jmkeys,
clauses,
OUTER,
@@ -339,19 +337,18 @@ match_unsorted_outer(RelOptInfo *joinrel,
{
bool path_is_cheaper_than_sort;
List *varkeys = NIL;
Path *mergeinnerpath = match_paths_joinkeys(matchedJoinKeys,
outerpath_ordering,
innerrel->pathlist,
INNER);
Path *mergeinnerpath = get_cheapest_path_for_joinkeys(
matchedJoinKeys,
outerpath_ordering,
innerrel->pathlist,
INNER);
/* Should we use the mergeinner, or sort the cheapest inner? */
path_is_cheaper_than_sort = (bool) (mergeinnerpath &&
(mergeinnerpath->path_cost <
(cheapest_inner->path_cost +
cost_sort(matchedJoinKeys,
innerrel->size,
innerrel->width,
false))));
(mergeinnerpath->path_cost <
(cheapest_inner->path_cost +
cost_sort(matchedJoinKeys, innerrel->size,
innerrel->width, false))));
if (!path_is_cheaper_than_sort)
{
varkeys = extract_path_keys(matchedJoinKeys,
@@ -451,11 +448,10 @@ match_unsorted_inner(RelOptInfo *joinrel,
if (clauses)
{
List *jmkeys = xmergeinfo->jmethod.jmkeys;
List *cls = xmergeinfo->jmethod.clauses;
matchedJoinKeys = match_pathkeys_joinkeys(innerpath->pathkeys,
matchedJoinKeys = order_joinkeys_by_pathkeys(innerpath->pathkeys,
jmkeys,
cls,
clauses,
INNER,
&matchedJoinClauses);
}

View File

@@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/optimizer/path/Attic/pathkey.c,v 1.2 1999/02/19 02:05:15 momjian Exp $
* $Header: /cvsroot/pgsql/src/backend/optimizer/path/Attic/pathkey.c,v 1.3 1999/02/19 05:18:05 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -28,7 +28,7 @@
static int match_pathkey_joinkeys(List *pathkey, List *joinkeys,
int outer_or_inner);
static bool every_func(List *joinkeys, List *pathkey,
static bool joinkeys_pathkeys_match(List *joinkeys, List *pathkey,
int outer_or_inner);
static List *new_join_pathkey(List *subkeys, List *considered_subkeys,
List *join_rel_tlist, List *joinclauses);
@@ -40,7 +40,7 @@ static List *new_matching_subkeys(Var *subkey, List *considered_subkeys,
****************************************************************************/
/*
* match_pathkeys_joinkeys
* order_joinkeys_by_pathkeys
* Attempts to match the keys of a path against the keys of join clauses.
* This is done by looking for a matching join key in 'joinkeys' for
* every path key in the list 'path.keys'. If there is a matching join key
@@ -69,7 +69,7 @@ static List *new_matching_subkeys(Var *subkey, List *considered_subkeys,
* in matchedJoinClausesPtr. - ay 11/94
*/
List *
match_pathkeys_joinkeys(List *pathkeys,
order_joinkeys_by_pathkeys(List *pathkeys,
List *joinkeys,
List *joinclauses,
int outer_or_inner,
@@ -92,21 +92,18 @@ match_pathkeys_joinkeys(List *pathkeys,
List *xjoinkey = nth(matched_joinkey_index, joinkeys);
List *joinclause = nth(matched_joinkey_index, joinclauses);
matched_joinkeys = lcons(xjoinkey, matched_joinkeys);
matched_joinclauses = lcons(joinclause, matched_joinclauses);
joinkeys = LispRemove(xjoinkey, joinkeys);
matched_joinkeys = lappend(matched_joinkeys, xjoinkey);
matched_joinclauses = lappend(matched_joinclauses, joinclause);
}
else
{
*matchedJoinClausesPtr = NIL;
return NIL;
}
}
if (matched_joinkeys == NULL ||
length(matched_joinkeys) != length(pathkeys))
return NIL;
*matchedJoinClausesPtr = nreverse(matched_joinclauses);
return nreverse(matched_joinkeys);
*matchedJoinClausesPtr = matched_joinclauses;
return matched_joinkeys;
}
@@ -144,7 +141,7 @@ match_pathkey_joinkeys(List *pathkey,
/*
* match_paths_joinkeys
* get_cheapest_path_for_joinkeys
* Attempts to find a path in 'paths' whose keys match a set of join
* keys 'joinkeys'. To match,
* 1. the path node ordering must equal 'ordering'.
@@ -165,31 +162,27 @@ match_pathkey_joinkeys(List *pathkey,
* Find the cheapest path that matches the join keys
*/
Path *
match_paths_joinkeys(List *joinkeys,
PathOrder *ordering,
List *paths,
int outer_or_inner)
get_cheapest_path_for_joinkeys(List *joinkeys,
PathOrder *ordering,
List *paths,
int outer_or_inner)
{
Path *matched_path = NULL;
bool key_match = false;
List *i = NIL;
foreach(i, paths)
{
Path *path = (Path *) lfirst(i);
int better_sort;
int better_sort, better_key;
key_match = every_func(joinkeys, path->pathkeys, outer_or_inner);
if (pathorder_match(ordering, path->pathorder, &better_sort) &&
better_sort == 0 &&
length(joinkeys) == length(path->pathkeys) && key_match)
if (joinkeys_pathkeys_match(joinkeys, path->pathkeys, outer_or_inner) &&
length(joinkeys) == length(path->pathkeys) &&
pathorder_match(ordering, path->pathorder, &better_sort) &&
better_sort == 0)
{
if (matched_path)
{
if (path->path_cost < matched_path->path_cost)
matched_path = path;
}
else
matched_path = path;
}
@@ -253,10 +246,10 @@ extract_path_keys(List *joinkeys,
/*
* every_func
* joinkeys_pathkeys_match
*/
static bool
every_func(List *joinkeys, List *pathkey, int outer_or_inner)
joinkeys_pathkeys_match(List *joinkeys, List *pathkey, int outer_or_inner)
{
JoinKey *xjoinkey;
Var *temp;