From 61aa8258769d5b63d03931188aceb96de1273e16 Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Sun, 14 Feb 1999 04:57:02 +0000 Subject: [PATCH] Optimizer rename. --- doc/src/sgml/ref/set.sgml | 4 +-- src/backend/optimizer/geqo/geqo_eval.c | 4 +-- src/backend/optimizer/path/allpaths.c | 40 +++++++++----------------- src/backend/optimizer/path/joinpath.c | 13 ++++----- src/backend/optimizer/path/joinrels.c | 13 ++++++--- src/backend/optimizer/path/prune.c | 16 +++++------ src/backend/optimizer/plan/initsplan.c | 8 +++--- src/backend/optimizer/plan/planmain.c | 11 ++----- src/include/optimizer/paths.h | 8 +++--- src/include/optimizer/planmain.h | 4 +-- src/include/version.h.in | 6 ++-- src/man/set.l | 6 ++-- 12 files changed, 59 insertions(+), 74 deletions(-) diff --git a/doc/src/sgml/ref/set.sgml b/doc/src/sgml/ref/set.sgml index ac3c225267a..a88e767f037 100644 --- a/doc/src/sgml/ref/set.sgml +++ b/doc/src/sgml/ref/set.sgml @@ -406,7 +406,7 @@ SET TIME ZONE { 'timezone' | LOCAL This algorithm is on by default, which used GEQO for - statements of six or more tables and indexes. + statements of six or more tables. (See the chapter on GEQO in the Programmer's Guide for more information). @@ -677,7 +677,7 @@ SET TIME ZONE { 'timezone' | LOCAL SET DATESTYLE TO 'ISO'; - --Enable GEQO for queries with 4 or more tables and indexes + --Enable GEQO for queries with 4 or more tables -- SET GEQO ON=4; diff --git a/src/backend/optimizer/geqo/geqo_eval.c b/src/backend/optimizer/geqo/geqo_eval.c index 925dbe93faf..71d7f0f399c 100644 --- a/src/backend/optimizer/geqo/geqo_eval.c +++ b/src/backend/optimizer/geqo/geqo_eval.c @@ -5,7 +5,7 @@ * * Copyright (c) 1994, Regents of the University of California * - * $Id: geqo_eval.c,v 1.29 1999/02/13 23:16:07 momjian Exp $ + * $Id: geqo_eval.c,v 1.30 1999/02/14 04:56:45 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -135,7 +135,7 @@ gimme_tree(Query *root, Gene *tour, int rel_count, int num_gene, RelOptInfo *out } /* process new_rel->pathlist */ - find_all_join_paths(root, new_rels); + update_rels_pathlist_for_joins(root, new_rels); /* prune new_rels */ /* MAU: is this necessary? */ diff --git a/src/backend/optimizer/path/allpaths.c b/src/backend/optimizer/path/allpaths.c index 892ed5b3412..d4c88fc694d 100644 --- a/src/backend/optimizer/path/allpaths.c +++ b/src/backend/optimizer/path/allpaths.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/optimizer/path/allpaths.c,v 1.31 1999/02/13 23:16:14 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/optimizer/path/allpaths.c,v 1.32 1999/02/14 04:56:46 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -43,7 +43,7 @@ bool _use_geqo_ = false; int32 _use_geqo_rels_ = GEQO_RELS; -static void find_rel_paths(Query *root, List *rels); +static void find_base_rel_paths(Query *root, List *rels); static List *find_join_paths(Query *root, List *outer_rels, int levels_needed); #ifdef OPTIMIZER_DEBUG @@ -71,10 +71,7 @@ find_paths(Query *root, List *rels) if (levels_needed <= 0) return NIL; - /* - * Find the base relation paths. - */ - find_rel_paths(root, rels); + find_base_rel_paths(root, rels); if (levels_needed <= 1) { @@ -96,7 +93,7 @@ find_paths(Query *root, List *rels) } /* - * find_rel_paths + * find_base_rel_paths * Finds all paths available for scanning each relation entry in * 'rels'. Sequential scan and any available indices are considered * if possible(indices are not considered for lower nesting levels). @@ -105,7 +102,7 @@ find_paths(Query *root, List *rels) * MODIFIES: rels */ static void -find_rel_paths(Query *root, List *rels) +find_base_rel_paths(Query *root, List *rels) { List *temp; @@ -154,7 +151,7 @@ find_rel_paths(Query *root, List *rels) * finding ways to join relations(both original and derived) together. * * 'outer_rels' is the current list of relations for which join paths - * are to be found, i.e., he current list of relations that + * are to be found, i.e., the current list of relations that * have already been derived. * 'levels_needed' is the number of iterations needed * @@ -172,20 +169,8 @@ find_join_paths(Query *root, List *outer_rels, int levels_needed) * genetic query optimizer entry point * * * *******************************************/ - { - List *temp; - int paths_to_consider = 0; - - foreach(temp, outer_rels) - { - RelOptInfo *rel = (RelOptInfo *) lfirst(temp); - paths_to_consider += length(rel->pathlist); - } - - if ((_use_geqo_) && paths_to_consider >= _use_geqo_rels_) - /* returns _one_ RelOptInfo, so lcons it */ - return lcons(geqo(root), NIL); - } + if ((_use_geqo_) && length(root->base_relation_list_) >= _use_geqo_rels_) + return lcons(geqo(root), NIL); /* returns *one* Rel, so lcons it */ /******************************************* * rest will be deprecated in case of GEQO * @@ -199,11 +184,11 @@ find_join_paths(Query *root, List *outer_rels, int levels_needed) * modify 'new_rels' accordingly, then eliminate redundant join * relations. */ - new_rels = find_join_rels(root, outer_rels); + new_rels = make_new_rels_by_joins(root, outer_rels); - find_all_join_paths(root, new_rels); + update_rels_pathlist_for_joins(root, new_rels); - prune_joinrels(new_rels); + merge_rels_with_same_relids(new_rels); #if 0 /* @@ -232,11 +217,11 @@ find_join_paths(Query *root, List *outer_rels, int levels_needed) foreach(x, new_rels) { rel = (RelOptInfo *) lfirst(x); + if (rel->size <= 0) rel->size = compute_rel_size(rel); rel->width = compute_rel_width(rel); - /* #define OPTIMIZER_DEBUG */ #ifdef OPTIMIZER_DEBUG printf("levels left: %d\n", levels_needed); debug_print_rel(root, rel); @@ -259,6 +244,7 @@ find_join_paths(Query *root, List *outer_rels, int levels_needed) } else root->join_rel_list = new_rels; + if (!BushyPlanFlag) outer_rels = new_rels; } diff --git a/src/backend/optimizer/path/joinpath.c b/src/backend/optimizer/path/joinpath.c index aa197671a58..e5d19017909 100644 --- a/src/backend/optimizer/path/joinpath.c +++ b/src/backend/optimizer/path/joinpath.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/optimizer/path/joinpath.c,v 1.23 1999/02/13 23:16:18 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/optimizer/path/joinpath.c,v 1.24 1999/02/14 04:56:46 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -42,7 +42,7 @@ static List *hash_inner_and_outer(RelOptInfo *joinrel, RelOptInfo *outerrel, Rel List *hashinfo_list); /* - * find_all_join_paths + * update_rels_pathlist_for_joins * Creates all possible ways to process joins for each of the join * relations in the list 'joinrels.' Each unique path will be included * in the join relation's 'pathlist' field. @@ -62,16 +62,17 @@ static List *hash_inner_and_outer(RelOptInfo *joinrel, RelOptInfo *outerrel, Rel * It does a destructive modification. */ void -find_all_join_paths(Query *root, List *joinrels) +update_rels_pathlist_for_joins(Query *root, List *joinrels) { List *mergeinfo_list = NIL; List *hashinfo_list = NIL; List *temp_list = NIL; List *path = NIL; + List *j; - while (joinrels != NIL) + foreach(j, joinrels) { - RelOptInfo *joinrel = (RelOptInfo *) lfirst(joinrels); + RelOptInfo *joinrel = (RelOptInfo *) lfirst(j); List *innerrelids; List *outerrelids; RelOptInfo *innerrel; @@ -174,8 +175,6 @@ find_all_join_paths(Query *root, List *joinrels) * since the base level */ } - - joinrels = lnext(joinrels); } } diff --git a/src/backend/optimizer/path/joinrels.c b/src/backend/optimizer/path/joinrels.c index e9dc2dcbb1c..4e0307c8749 100644 --- a/src/backend/optimizer/path/joinrels.c +++ b/src/backend/optimizer/path/joinrels.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/optimizer/path/joinrels.c,v 1.20 1999/02/13 23:16:18 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/optimizer/path/joinrels.c,v 1.21 1999/02/14 04:56:47 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -44,7 +44,7 @@ static void set_joinrel_size(RelOptInfo *joinrel, RelOptInfo *outer_rel, RelOptI JoinInfo * jinfo); /* - * find_join_rels + * make_new_rels_by_joins * Find all possible joins for each of the outer join relations in * 'outer_rels'. A rel node is created for each possible join relation, * and the resulting list of nodes is returned. If at all possible, only @@ -57,7 +57,7 @@ static void set_joinrel_size(RelOptInfo *joinrel, RelOptInfo *outer_rel, RelOptI * Returns a list of rel nodes corresponding to the new join relations. */ List * -find_join_rels(Query *root, List *outer_rels) +make_new_rels_by_joins(Query *root, List *outer_rels) { List *joins = NIL; List *join_list = NIL; @@ -69,6 +69,10 @@ find_join_rels(Query *root, List *outer_rels) if (!(joins = find_clause_joins(root, outer_rel, outer_rel->joininfo))) { + /* + * Oops, we have a relation that is not joined to any other + * relation. Cartesian product time. + */ if (BushyPlanFlag) joins = find_clauseless_joins(outer_rel, outer_rels); else @@ -124,7 +128,8 @@ find_clause_joins(Query *root, RelOptInfo *outer_rel, List *joininfo_list) { if (rel != NULL) join_list = lappend(join_list, rel); - rel = init_join_rel(get_base_rel(root, lfirsti(other_rels)), + rel = init_join_rel(get_base_rel(root, + lfirsti(other_rels)), outer_rel, joininfo); } diff --git a/src/backend/optimizer/path/prune.c b/src/backend/optimizer/path/prune.c index ce6b22d98e6..828b8cce80f 100644 --- a/src/backend/optimizer/path/prune.c +++ b/src/backend/optimizer/path/prune.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/optimizer/path/Attic/prune.c,v 1.31 1999/02/13 23:16:23 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/optimizer/path/Attic/prune.c,v 1.32 1999/02/14 04:56:47 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -24,10 +24,10 @@ #include "utils/elog.h" -static List *prune_joinrel(RelOptInfo *rel, List *other_rels); +static List *merge_rel_with_same_relids(RelOptInfo *rel, List *other_rels); /* - * prune_joinrels + * merge_rels_with_same_relids * Removes any redundant relation entries from a list of rel nodes * 'rel_list'. Obviously, the first relation can't be a duplicate. * @@ -35,7 +35,7 @@ static List *prune_joinrel(RelOptInfo *rel, List *other_rels); * */ void -prune_joinrels(List *rel_list) +merge_rels_with_same_relids(List *rel_list) { List *i; @@ -44,11 +44,11 @@ prune_joinrels(List *rel_list) * deleted */ foreach(i, rel_list) - lnext(i) = prune_joinrel((RelOptInfo *) lfirst(i), lnext(i)); + lnext(i) = merge_rel_with_same_relids((RelOptInfo *) lfirst(i), lnext(i)); } /* - * prune_joinrel + * merge_rel_with_same_relids * Prunes those relations from 'other_rels' that are redundant with * 'rel'. A relation is redundant if it is built up of the same * relations as 'rel'. Paths for the redundant relation are merged into @@ -59,7 +59,7 @@ prune_joinrels(List *rel_list) * */ static List * -prune_joinrel(RelOptInfo *rel, List *other_rels) +merge_rel_with_same_relids(RelOptInfo *rel, List *other_rels) { List *i = NIL; List *result = NIL; @@ -126,7 +126,7 @@ merge_joinrels(List *rel_list1, List *rel_list2) { RelOptInfo *rel = (RelOptInfo *) lfirst(xrel); - rel_list2 = prune_joinrel(rel, rel_list2); + rel_list2 = merge_rel_with_same_relids(rel, rel_list2); } return append(rel_list1, rel_list2); } diff --git a/src/backend/optimizer/plan/initsplan.c b/src/backend/optimizer/plan/initsplan.c index 40ab228721d..a1762ad8dfe 100644 --- a/src/backend/optimizer/plan/initsplan.c +++ b/src/backend/optimizer/plan/initsplan.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/optimizer/plan/initsplan.c,v 1.23 1999/02/13 23:16:29 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/optimizer/plan/initsplan.c,v 1.24 1999/02/14 04:56:50 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -303,16 +303,16 @@ add_vars_to_targetlist(Query *root, List *vars, List *join_relids) *****************************************************************************/ /* - * init_join_info + * set_joininfo_mergeable_hashable * Set the MergeJoinable or HashJoinable field for every joininfo node - * (within a rel node) and the MergeJoinOrder or HashJoinOp field for + * (within a rel node) and the mergejoinorder or hashjoinop field for * each restrictinfo node(within a joininfo node) for all relations in a * query. * * Returns nothing. */ void -init_join_info(List *rel_list) +set_joininfo_mergeable_hashable(List *rel_list) { List *x, *y, diff --git a/src/backend/optimizer/plan/planmain.c b/src/backend/optimizer/plan/planmain.c index 8e56f228c56..ff84df67eda 100644 --- a/src/backend/optimizer/plan/planmain.c +++ b/src/backend/optimizer/plan/planmain.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/optimizer/plan/planmain.c,v 1.31 1999/02/13 23:16:30 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/optimizer/plan/planmain.c,v 1.32 1999/02/14 04:56:50 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -157,7 +157,7 @@ query_planner(Query *root, else return (Plan *) scan; } - break; + break; default: return (Plan *) NULL; } @@ -257,12 +257,7 @@ subplanner(Query *root, add_restrict_and_join_to_rels(root, qual); add_missing_vars_to_tlist(root, flat_tlist); - /* - * Find all possible scan and join paths. Mark all the clauses and - * relations that can be processed using special join methods, then do - * the exhaustive path search. - */ - init_join_info(root->base_rel_list); + set_joininfo_mergeable_hashable(root->base_rel_list); final_rel_list = find_paths(root, root->base_rel_list); diff --git a/src/include/optimizer/paths.h b/src/include/optimizer/paths.h index 5938e0e849e..99a1cad9804 100644 --- a/src/include/optimizer/paths.h +++ b/src/include/optimizer/paths.h @@ -7,7 +7,7 @@ * * Copyright (c) 1994, Regents of the University of California * - * $Id: paths.h,v 1.15 1999/02/13 23:21:50 momjian Exp $ + * $Id: paths.h,v 1.16 1999/02/14 04:56:55 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -35,7 +35,7 @@ extern List *find_index_paths(Query *root, RelOptInfo *rel, List *indices, * joinpath.h * routines to create join paths */ -extern void find_all_join_paths(Query *root, List *joinrels); +extern void update_rels_pathlist_for_joins(Query *root, List *joinrels); /* @@ -77,14 +77,14 @@ extern MergeInfo *match_order_mergeinfo(PathOrder *ordering, * joinrels.h * routines to determine which relations to join */ -extern List *find_join_rels(Query *root, List *outer_rels); +extern List *make_new_rels_by_joins(Query *root, List *outer_rels); extern void add_new_joininfos(Query *root, List *joinrels, List *outerrels); extern List *final_join_rels(List *join_rel_list); /* * prototypes for path/prune.c */ -extern void prune_joinrels(List *rel_list); +extern void merge_rels_with_same_relids(List *rel_list); extern void rels_set_cheapest(List *rel_list); extern List *merge_joinrels(List *rel_list1, List *rel_list2); extern List *prune_oldrels(List *old_rels); diff --git a/src/include/optimizer/planmain.h b/src/include/optimizer/planmain.h index 8c10eddc553..42e22e150f3 100644 --- a/src/include/optimizer/planmain.h +++ b/src/include/optimizer/planmain.h @@ -6,7 +6,7 @@ * * Copyright (c) 1994, Regents of the University of California * - * $Id: planmain.h,v 1.21 1999/02/13 23:21:50 momjian Exp $ + * $Id: planmain.h,v 1.22 1999/02/14 04:56:58 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -43,7 +43,7 @@ extern Unique *make_unique(List *tlist, Plan *lefttree, char *uniqueAttr); */ extern void make_var_only_tlist(Query *root, List *tlist); extern void add_restrict_and_join_to_rels(Query *root, List *clauses); -extern void init_join_info(List *rel_list); +extern void set_joininfo_mergeable_hashable(List *rel_list); extern void add_missing_vars_to_tlist(Query *root, List *tlist); /* diff --git a/src/include/version.h.in b/src/include/version.h.in index 964fa70a92a..0544b8819a6 100644 --- a/src/include/version.h.in +++ b/src/include/version.h.in @@ -1,10 +1,10 @@ -/*------------------------------------------------------------------------- +/*------------------------------------------------------------------------- * - * version.h.in-- + * version.h.in * this file contains the interface to version.c. * Also some parameters. * - * $Header: /cvsroot/pgsql/src/include/Attic/version.h.in,v 1.4 1998/12/25 02:20:11 momjian Exp $ + * $Header: /cvsroot/pgsql/src/include/Attic/version.h.in,v 1.5 1999/02/14 04:56:54 momjian Exp $ * *------------------------------------------------------------------------- */ diff --git a/src/man/set.l b/src/man/set.l index d3e5f53bf32..d47e571ac37 100644 --- a/src/man/set.l +++ b/src/man/set.l @@ -1,6 +1,6 @@ .\" This is -*-nroff-*- .\" XXX standard disclaimer belongs here.... -.\" $Header: /cvsroot/pgsql/src/man/Attic/set.l,v 1.13 1999/02/02 20:30:18 momjian Exp $ +.\" $Header: /cvsroot/pgsql/src/man/Attic/set.l,v 1.14 1999/02/14 04:57:02 momjian Exp $ .TH SET SQL 05/14/97 PostgreSQL PostgreSQL .SH NAME set - set run-time parameters for session @@ -44,7 +44,7 @@ determines the output format for the date and time data types. .IR GEQO enables or disables the genetic optimizer algorithm. This algorithm is .IR on -by default, which used GEQO for statements of six or more tables and indexes. +by default, which used GEQO for statements of six or more tables. Set the .IR Programmer's Guide for more information. @@ -101,7 +101,7 @@ set DateStyle to 'SQL,European' .PP .nf -- ---Use GEQO for statements with 4 or more tables and indexes +--Use GEQO for statements with 4 or more tables -- set GEQO to 'on=4' --