Re: why do we need two snapshots per query? - Mailing list pgsql-hackers

From Robert Haas
Subject Re: why do we need two snapshots per query?
Date
Msg-id CA+Tgmob+ui+Jo-tWH_Vs=JQ4u4pj4r49kcDV=LkOkQre2bkz6Q@mail.gmail.com
Whole thread Raw
In response to Re: why do we need two snapshots per query?  (Tom Lane <tgl@sss.pgh.pa.us>)
Responses Re: why do we need two snapshots per query?
List pgsql-hackers
On Sun, Nov 13, 2011 at 11:09 AM, Tom Lane <tgl@sss.pgh.pa.us> wrote:
> Simon Riggs <simon@2ndQuadrant.com> writes:
>> If we could be certain that a query was being executed immediately
>
> ... that is, with the same snapshot ...
>
>> then it would be possible to simplify expressions using stable
>> functions as if they were constants. My earlier patch did exactly
>> that.
>
> Mph.  I had forgotten about that aspect of it.  I think that it's
> very largely superseded by Marti Raudsepp's pending patch:
> https://commitfest.postgresql.org/action/patch_view?id=649
> which does more and doesn't require any assumption that plan and
> execution snapshots are the same.
>
> Now you're going to say that that doesn't help for failure to prove
> partial index or constraint conditions involving stable functions,
> and my answer is going to be that that isn't an interesting use-case.
> Partial index conditions *must* be immutable, and constraint conditions
> *should* be.  As far as partitioning goes, the correct solution there
> is to move the partition selection to run-time, so we should not be
> contorting query semantics to make incremental performance improvements
> with the existing partitioning infrastructure.
>
> I remain of the opinion that Robert's proposal is a bad idea.

Wait a minute.  I can understand why you think it's a bad idea to
preserve a snapshot across multiple protocol messages
(parse/bind/execute), but why or how would it be a bad idea to keep
the same snapshot between planning and execution when the whole thing
is being done as a unit?  You haven't offered any real justification
for that position, and it seems to me that if anything the semantics
of such a thing are far *less* intuitive than it would be to do the
whole thing under a single snapshot.  The whole point of snapshot
isolation is that our view of the database doesn't change mid-query;
and yet you are now saying that's exactly the behavior we should have.That seems exactly backwards to me.

I also think you are dismissing Simon's stable-expression-folding
proposal far too lightly.  I am not sure that the behavior he wants is
safe given the current details of our implementation - or even with my
patch; I suspect a little more than that is needed - but I am pretty
certain it's the behavior that users want and expect, and we should be
moving toward it, not away from it.  I have seen a significant number
of cases over the years where the query optimizer generated a bad plan
because it did less constant-folding than the user expected.  Users do
not walk around thinking about the fact that the planner and executor
are separate modules and therefore probably should use separate
snapshots.  They expect their query to see a consistent view of the
database.  Period.

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company


pgsql-hackers by date:

Previous
From: Thom Brown
Date:
Subject: Re: Detach/attach database
Next
From: Jan Urbański
Date:
Subject: splitting plpython into smaller parts