From f1b78234716bd639b045873c7be0c9424b897f16 Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Tue, 2 Feb 1999 20:30:18 +0000 Subject: [PATCH] Make GEQO use dependent on table and index count. --- doc/src/sgml/ref/set.sgml | 7 ++++++- src/backend/optimizer/path/allpaths.c | 25 +++++++++++++++---------- src/backend/parser/gram.c | 14 +++++++++++++- src/man/set.l | 6 +++--- 4 files changed, 37 insertions(+), 15 deletions(-) diff --git a/doc/src/sgml/ref/set.sgml b/doc/src/sgml/ref/set.sgml index 9627c1f354..ac3c225267 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. + statements of six or more tables and indexes. (See the chapter on GEQO in the Programmer's Guide for more information). @@ -676,6 +676,11 @@ SET TIME ZONE { 'timezone' | LOCAL -- SET DATESTYLE TO 'ISO'; + + --Enable GEQO for queries with 4 or more tables and indexes + -- + SET GEQO ON=4; + --Set GEQO to default: -- diff --git a/src/backend/optimizer/path/allpaths.c b/src/backend/optimizer/path/allpaths.c index 8de364a04a..4e5ab10094 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.23 1998/09/01 04:29:27 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/optimizer/path/allpaths.c,v 1.24 1999/02/02 20:30:05 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -78,7 +78,6 @@ find_paths(Query *root, List *rels) if (levels_needed <= 1) { - /* * Unsorted single relation, no more processing is required. */ @@ -86,7 +85,6 @@ find_paths(Query *root, List *rels) } else { - /* * this means that joins or sorts are required. set selectivities * of clauses that have not been set by an index. @@ -123,7 +121,7 @@ find_rel_paths(Query *root, List *rels) rel_index_scan_list = find_index_paths(root, rel, - find_relation_indices(root, rel), + find_relation_indices(root, rel), rel->clauseinfo, rel->joininfo); @@ -182,18 +180,27 @@ find_join_paths(Query *root, List *outer_rels, int levels_needed) * genetic query optimizer entry point * * * *******************************************/ + { + List *temp; + int paths_to_consider = 0; - if ((_use_geqo_) && length(root->base_rel_list) >= _use_geqo_rels_) - return lcons(geqo(root), NIL); /* returns *one* RelOptInfo, so - * lcons it */ + 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); + } + /******************************************* * rest will be deprecated in case of GEQO * *******************************************/ while (--levels_needed) { - /* * Determine all possible pairs of relations to be joined at this * level. Determine paths for joining these relation pairs and @@ -207,7 +214,6 @@ find_join_paths(Query *root, List *outer_rels, int levels_needed) prune_joinrels(new_rels); #if 0 - /* * * for each expensive predicate in each path in each distinct * rel, * consider doing pullup -- JMH @@ -247,7 +253,6 @@ find_join_paths(Query *root, List *outer_rels, int levels_needed) if (BushyPlanFlag) { - /* * prune rels that have been completely incorporated into new * join rels diff --git a/src/backend/parser/gram.c b/src/backend/parser/gram.c index 8ae45f764f..2081b741f9 100644 --- a/src/backend/parser/gram.c +++ b/src/backend/parser/gram.c @@ -240,7 +240,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/parser/Attic/gram.c,v 2.66 1999/02/02 03:44:34 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/parser/Attic/gram.c,v 2.67 1999/02/02 20:30:07 momjian Exp $ * * HISTORY * AUTHOR DATE MAJOR EVENT @@ -11450,11 +11450,17 @@ static Node *makeIndexable(char *opname, Node *lexpr, Node *rexpr) least->val.val.str = match_least; most->val.type = T_String; most->val.val.str = match_most; +#ifdef USE_LOCALE + result = makeA_Expr(AND, NULL, + makeA_Expr(OP, "~", lexpr, rexpr), + makeA_Expr(OP, ">=", lexpr, (Node *)least)); +#else result = makeA_Expr(AND, NULL, makeA_Expr(OP, "~", lexpr, rexpr), makeA_Expr(AND, NULL, makeA_Expr(OP, ">=", lexpr, (Node *)least), makeA_Expr(OP, "<=", lexpr, (Node *)most))); +#endif } } } @@ -11497,11 +11503,17 @@ static Node *makeIndexable(char *opname, Node *lexpr, Node *rexpr) least->val.val.str = match_least; most->val.type = T_String; most->val.val.str = match_most; +#ifdef USE_LOCALE + result = makeA_Expr(AND, NULL, + makeA_Expr(OP, "~~", lexpr, rexpr), + makeA_Expr(OP, ">=", lexpr, (Node *)least)); +#else result = makeA_Expr(AND, NULL, makeA_Expr(OP, "~~", lexpr, rexpr), makeA_Expr(AND, NULL, makeA_Expr(OP, ">=", lexpr, (Node *)least), makeA_Expr(OP, "<=", lexpr, (Node *)most))); +#endif } } } diff --git a/src/man/set.l b/src/man/set.l index 3ce8896cd4..d3e5f53bf3 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.12 1999/02/02 03:45:33 momjian Exp $ +.\" $Header: /cvsroot/pgsql/src/man/Attic/set.l,v 1.13 1999/02/02 20:30:18 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. +by default, which used GEQO for statements of six or more tables and indexes. 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 +--Use GEQO for statements with 4 or more tables and indexes -- set GEQO to 'on=4' --