diff --git a/doc/src/sgml/runtime.sgml b/doc/src/sgml/runtime.sgml index e464e66878a5fbf580641ca87e258dc71a6151ed..f81c920d26d3afcf6a8b6da30810b2270c912533 100644 --- a/doc/src/sgml/runtime.sgml +++ b/doc/src/sgml/runtime.sgml @@ -1,5 +1,5 @@ <!-- -$PostgreSQL: pgsql/doc/src/sgml/runtime.sgml,v 1.230 2004/01/10 23:28:43 neilc Exp $ +$PostgreSQL: pgsql/doc/src/sgml/runtime.sgml,v 1.231 2004/01/21 23:33:34 tgl Exp $ --> <Chapter Id="runtime"> @@ -1404,23 +1404,25 @@ SET ENABLE_SEQSCAN TO OFF; </varlistentry> <varlistentry> - <term><varname>geqo_effort</varname> (<type>integer</type>)</term> - <term><varname>geqo_generations</varname> (<type>integer</type>)</term> <term><varname>geqo_pool_size</varname> (<type>integer</type>)</term> + <term><varname>geqo_generations</varname> (<type>integer</type>)</term> + <term><varname>geqo_effort</varname> (<type>integer</type>)</term> <term><varname>geqo_selection_bias</varname> (<type>floating point</type>)</term> <listitem> <para> Various tuning parameters for the genetic query optimization - algorithm: The pool size is the number of individuals in one + algorithm. The pool size is the number of individuals in one population. Valid values are between 128 and 1024. If it is set to 0 (the default) a pool size of 2^(QS+1), where QS is the - number of <literal>FROM</> items in the query, is taken. The effort is used - to calculate a default for generations. Valid values are between - 1 and 80, 40 being the default. Generations specifies the number - of iterations in the algorithm. The number must be a positive - integer. If 0 is specified then <literal>Effort * - Log2(PoolSize)</literal> is used. The run time of the algorithm - is roughly proportional to the sum of pool size and generations. + number of <literal>FROM</> items in the query, is used. + Generations specifies the number of iterations of the algorithm. + The value must be a positive integer. If 0 is specified then + <literal>Effort * Log2(PoolSize)</literal> is used. + The run time of the algorithm is roughly proportional to the sum of + pool size and generations. + <varname>geqo_effort</varname> is only used in computing the default + generations setting, as just described. The default value is 40, + and the allowed range 1 to 100. The selection bias is the selective pressure within the population. Values can be from 1.50 to 2.00; the latter is the default. diff --git a/src/backend/optimizer/geqo/geqo_main.c b/src/backend/optimizer/geqo/geqo_main.c index 9b16c4a06e6ee140fc892a982de8bc45289834ba..6a883fa313799ac8e26e570967deea764a61d414 100644 --- a/src/backend/optimizer/geqo/geqo_main.c +++ b/src/backend/optimizer/geqo/geqo_main.c @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/backend/optimizer/geqo/geqo_main.c,v 1.41 2003/11/29 19:51:50 pgsql Exp $ + * $PostgreSQL: pgsql/src/backend/optimizer/geqo/geqo_main.c,v 1.42 2004/01/21 23:33:34 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -38,13 +38,13 @@ * Configuration options */ int Geqo_pool_size; -int Geqo_effort; int Geqo_generations; +int Geqo_effort; double Geqo_selection_bias; static int gimme_pool_size(int nr_rel); -static int gimme_number_generations(int pool_size, int effort); +static int gimme_number_generations(int pool_size); /* define edge recombination crossover [ERX] per default */ #if !defined(ERX) && \ @@ -92,7 +92,7 @@ geqo(Query *root, int number_of_rels, List *initial_rels) /* set GA parameters */ pool_size = gimme_pool_size(number_of_rels); - number_generations = gimme_number_generations(pool_size, Geqo_effort); + number_generations = gimme_number_generations(pool_size); status_interval = 10; /* allocate genetic pool memory */ @@ -284,7 +284,7 @@ gimme_pool_size(int nr_rel) { double size; - if (Geqo_pool_size != 0) + if (Geqo_pool_size > 0) return Geqo_pool_size; size = pow(2.0, nr_rel + 1.0); @@ -305,10 +305,20 @@ gimme_pool_size(int nr_rel) * = Effort * Log2(PoolSize) */ static int -gimme_number_generations(int pool_size, int effort) +gimme_number_generations(int pool_size) { - if (Geqo_generations <= 0) - return effort * (int) ceil(log((double) pool_size) / log(2.0)); - else + double gens; + + if (Geqo_generations > 0) return Geqo_generations; + + gens = Geqo_effort * log((double) pool_size) / log(2.0); + + /* bound it to a sane range */ + if (gens <= 0) + gens = 1; + else if (gens > 10000) + gens = 10000; + + return (int) ceil(gens); } diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index 45bbfc96ea0b0e5b2d67210f5e97b1a0295c893b..2633bf9e4d3ec0573560de0eca5f1e60d92cdb4d 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -10,7 +10,7 @@ * Written by Peter Eisentraut <peter_e@gmx.net>. * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.177 2004/01/19 19:04:40 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.178 2004/01/21 23:33:34 tgl Exp $ * *-------------------------------------------------------------------- */ @@ -931,23 +931,23 @@ static struct config_int ConfigureNamesInt[] = &Geqo_pool_size, DEFAULT_GEQO_POOL_SIZE, 0, MAX_GEQO_POOL_SIZE, NULL, NULL }, - { - {"geqo_effort", PGC_USERSET, QUERY_TUNING_GEQO, - gettext_noop("GEQO: effort is used to calculate a default for generations."), - NULL - }, - &Geqo_effort, - 1, 1, INT_MAX, NULL, NULL - }, { {"geqo_generations", PGC_USERSET, QUERY_TUNING_GEQO, - gettext_noop("GEQO: number of iterations in the algorithm."), - gettext_noop("The number must be a positive integer. If 0 is " + gettext_noop("GEQO: number of iterations of the algorithm."), + gettext_noop("The value must be a positive integer. If 0 is " "specified then effort * log2(poolsize) is used.") }, &Geqo_generations, 0, 0, INT_MAX, NULL, NULL }, + { + {"geqo_effort", PGC_USERSET, QUERY_TUNING_GEQO, + gettext_noop("GEQO: effort is used to set the default for generations."), + NULL + }, + &Geqo_effort, + DEFAULT_GEQO_EFFORT, MIN_GEQO_EFFORT, MAX_GEQO_EFFORT, NULL, NULL + }, { {"deadlock_timeout", PGC_SIGHUP, LOCK_MANAGEMENT, diff --git a/src/backend/utils/misc/postgresql.conf.sample b/src/backend/utils/misc/postgresql.conf.sample index 98d4d76d3ae6bd65a778c1592e030ed18508a8bf..0fdf6b2e99fd2e46534ee75dd3a3d69704078bec 100644 --- a/src/backend/utils/misc/postgresql.conf.sample +++ b/src/backend/utils/misc/postgresql.conf.sample @@ -123,10 +123,10 @@ #geqo = true #geqo_threshold = 11 -#geqo_effort = 1 -#geqo_generations = 0 #geqo_pool_size = 0 # default based on tables in statement, # range 128-1024 +#geqo_generations = 0 # use default: effort * log2(pool_size) +#geqo_effort = 40 # range 1-100 #geqo_selection_bias = 2.0 # range 1.5-2.0 # - Other Planner Options - diff --git a/src/include/optimizer/geqo.h b/src/include/optimizer/geqo.h index 249b477223031ccee00c5d175ee18ef4ff749d78..caa05f52ee971f9e53fd924440258ef22becf56d 100644 --- a/src/include/optimizer/geqo.h +++ b/src/include/optimizer/geqo.h @@ -6,7 +6,7 @@ * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/optimizer/geqo.h,v 1.33 2003/11/29 22:41:07 pgsql Exp $ + * $PostgreSQL: pgsql/src/include/optimizer/geqo.h,v 1.34 2004/01/21 23:33:34 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -44,22 +44,27 @@ /* * Configuration options + * + * If you change these, update backend/utils/misc/postgresql.sample.conf */ -/* If you change these, update backend/utils/misc/postgresql.sample.conf */ extern int Geqo_pool_size; #define DEFAULT_GEQO_POOL_SIZE 0 /* = default based on no. of relations. */ #define MIN_GEQO_POOL_SIZE 128 #define MAX_GEQO_POOL_SIZE 1024 -extern int Geqo_effort; /* 1 .. inf, only used to calculate - * generations default */ extern int Geqo_generations; /* 1 .. inf, or 0 to use default based on * pool size */ +extern int Geqo_effort; /* only used to calculate default for + * generations */ + +#define DEFAULT_GEQO_EFFORT 40 +#define MIN_GEQO_EFFORT 1 +#define MAX_GEQO_EFFORT 100 + extern double Geqo_selection_bias; -/* If you change these, update backend/utils/misc/postgresql.sample.conf */ #define DEFAULT_GEQO_SELECTION_BIAS 2.0 #define MIN_GEQO_SELECTION_BIAS 1.5 #define MAX_GEQO_SELECTION_BIAS 2.0