Optimizer rename.
This commit is contained in:
parent
6724a50787
commit
61aa825876
@ -406,7 +406,7 @@ SET TIME ZONE { '<REPLACEABLE CLASS="PARAMETER">timezone</REPLACEABLE>' | LOCAL
|
||||
</para>
|
||||
<para>
|
||||
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).
|
||||
</para>
|
||||
@ -677,7 +677,7 @@ SET TIME ZONE { '<REPLACEABLE CLASS="PARAMETER">timezone</REPLACEABLE>' | LOCAL
|
||||
SET DATESTYLE TO 'ISO';
|
||||
</programlisting>
|
||||
<programlisting>
|
||||
--Enable GEQO for queries with 4 or more tables and indexes
|
||||
--Enable GEQO for queries with 4 or more tables
|
||||
--
|
||||
SET GEQO ON=4;
|
||||
</programlisting>
|
||||
|
@ -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? */
|
||||
|
@ -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 *
|
||||
* <utesch@aut.tu-freiberg.de> *
|
||||
*******************************************/
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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,
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
||||
/*
|
||||
|
@ -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 $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
@ -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'
|
||||
--
|
||||
|
Loading…
Reference in New Issue
Block a user