Make planning via GEQO repeatable

From: Andres Freund <andres(at)anarazel(dot)de>
To: andres(at)anarazel(dot)de, pgsql-hackers(at)postgresql(dot)org
Subject: Make planning via GEQO repeatable
Date: 2009-07-14 22:34:47
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-hackers


Query planning via GEQO currently can yield a different plan on every
invokation of the planner due to its non-exhaustive nature.

This often can be inconvenient because at times there may be a very
bad plan. It also makes it very hard to reproduce a problem with GEQO.

[PATCH 1/3] Add erand48() implementation for non-unixoid systems.

I could not find any suitable PRNG with a visible/changeable state for
windows. Currently random() on windows is mapped to drand48() copied
out of FreeBSD. I copied erand48(state) from there as well.
As I have no windows with a buildsystem available at the moment this
is untested on windows!

[PATCH 2/3] Support a 'geqo_seed' GUC to make planning via GEQO repeatable.

This patch adds a GUC geqo_seed to control whether the PRNG should be
repeatable or not. If geqo_seed = 0 a global/per-backend state is
used, thus the planning is not repeatable.
If set to a value in (0,1] that number is used to initialize the
generator on every planning.

It adds a "void *join_search_private" variable to PlannerInfo to hold
the random number generator. This variable could also be used by a
join_order plugin.
Alternatively it would be possible to start passing GeqoEvalData
around everywhere, but the suggestion to extend PlannerInfo came from

"PlannerInfo *root" is now passed to all non-static geqo related
functions. It seems cleaner to do this for all functions than only
functions internally using the random generator.

GeqoEvalData, which is sparsely used, is replaced GeqoPrivateData
which is passed via join_search_private.

[PATCH 3/3] Document geqo_seed variable.

I will submit this to the commitfest. I guess thats OK?



Browse pgsql-hackers by date

  From Date Subject
Next Message Andres Freund 2009-07-14 22:34:48 [PATCH 1/3] Add erand48() implementation for non-unixoid systems.
Previous Message Andrew Dunstan 2009-07-14 22:21:37 Re: navigation menu for documents