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
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" |