Re: Prepared statements considered harmful

From: "Jeroen T(dot) Vermeulen" <jtv(at)xs4all(dot)nl>
To: "Phil Frost" <indigo(at)bitglue(dot)com>
Cc: pgsql-hackers(at)postgresql(dot)org
Subject: Re: Prepared statements considered harmful
Date: 2006-09-01 08:56:19
Message-ID: 20434.125.24.240.23.1157100979.squirrel@webmail.xs4all.nl
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

On Thu, August 31, 2006 21:41, Phil Frost wrote:

>> Is there any kind of pattern at all to this problem? Anything
>> recognizable? A few typical pitfalls?
>
> Frequently I have found preplanning will result in a horrible plan
> because it is assumed parameters may be volatile while in practice they
> are literals. Here is a function from my database:

That's a very common thing in processor design as well, and there's a
standard trick for it: the saturating two-bit counter. It tends to work
pretty well for branch prediction, value prediction etc. Usually it's the
first thing you reach for, so of course somebody may already have tried it
here and found it didn't work.

In this particular case it might be applied something like this: for each
parameter in a prepared statement you cache a predictor value, plus a
"confidence counter" saying (more or less--see below) how many times in
succession that value has repeated. Let's say each of the counters count
from 0 to 3 inclusive, with its confidence threshold right in the middle,
between 1 and 2.

On every invocation, you check each parameter value against the
corresponding predictor value. If it's identical, you increment its
counter (provided it can be incremented any further). If it isn't, you
decrement its counter, and if the counter ends up below its confidence
threshold, you replace the predictor value with the new parameter value.

Then, whenever any new planning needs to be done (I'll get to that in a
moment), you see which counters are above their confidence thresholds. In
your new planning you assume that all parameters with confident
predictions will remain pseudo-constant for the next few invocations.

Of course there's a problem when parameters do not match predicted values.
That's where having one or two backup plans could come in handy. You
could keep your original, fully-generalized plan around. If plans are
cheap enough to store, you could try to keep a cache of old plans for the
same query. The great thing about keeping some backup plans around is
that a pseudo-constant parameter can have a different value once in a
while, then flick back to its old habits without invalidating all your
efforts. Your usually-unused search fields are a good example. You may
also have two stable parameter patterns with different sets of
pseudo-constants competing for your attention.

It's not perfect, and it clearly has its pathological cases--but if it
works well enough overall, the bad cases could be caught and handled as
exceptions. Confidence counters can be tweaked to lose confidence more
easily than they gain it, or vice versa. Some meta-confidence scheme may
catch the worst offenders. I won't go into that now--first I'll shut up
and wait for others to point out what I've missed. :)

Jeroen

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Teodor Sigaev 2006-09-01 09:01:35 Re: GIN FailedAssertions on Itanium2 with Intel compiler
Previous Message Zeugswetter Andreas DCP SD 2006-09-01 08:26:20 Re: Win32 hard crash problem