Re: Stable function optimisation

From: Philipp Specht <phlybye(at)phlybye(dot)de>
To: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
Cc: pgsql-performance(at)postgresql(dot)org
Subject: Re: Stable function optimisation
Date: 2007-08-15 20:48:34
Message-ID: 62CBC6C5-93D8-4667-8143-02F6AF2B9C09@phlybye.de
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-performance

Hi Tom,

Thank you very much for your explanation.

On 13.08.2007, at 23:01, Tom Lane wrote:

> Philipp Specht <phlybye(at)phlybye(dot)de> writes:
>> The biggest question here is: Why is the runtime of the query with
>> the stable function not near the runtime of the immutable function?
>
> Stable functions don't get folded to constants.

I tried to force this by using the following construct:

SELECT t.id, t.a FROM public.t WHERE t.a=(VALUES(public.f()));

Is this a bad practice and will destroy some other thing I can't
think of at the moment? What it means for me at the moment is about
half the query time of a high usage query directly linked to a gui.
That's a big gain for a user interface and takes the query under the
magical 500ms response time...

>> It's definitely one query and the manual states that a stable
>> function does not change in one statement and therefore can be
>> optimised.
>
> That's not the type of optimization that gets done with it. What
> "STABLE" is for is marking functions that are safe to use in index
> conditions. If you'd been using an indexable condition you'd have
> seen three different behaviors here.
>
> (I see that you do have an index on t.a, but apparently there are
> too many matching rows for the planner to think the index is worth
> using.)

Yes, that's not the real problem here. It's only a test database and
the real data behaves a bit differently.

Have a nice day,
Philipp

In response to

Browse pgsql-performance by date

  From Date Subject
Next Message Michael Ben-Nes 2007-08-16 08:26:52 Integrated perc 5/i
Previous Message Mark Lewis 2007-08-15 20:03:10 Re: Indexscan is only used if we use "limit n"