Re: View "Caching" - Is this Known and Expected Behavior?

From: Merlin Moncure <mmoncure(at)gmail(dot)com>
To: David Johnston <polobo(at)yahoo(dot)com>
Cc: pgsql-general(at)postgresql(dot)org
Subject: Re: View "Caching" - Is this Known and Expected Behavior?
Date: 2011-08-23 22:07:54
Message-ID: CAHyXU0xkL1wQbfa7+jWZBoSqJr0RTRJD2i-gW=-aKKX-V4v-fA@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

On Tue, Aug 23, 2011 at 4:36 PM, David Johnston <polobo(at)yahoo(dot)com> wrote:
> Hey All,
>
> I am wondering whether the behavior I am observing is expected.  The rough
> scenario I have setup goes as follows (I can likely put together a test
> script if that is warranted):
>
> version
>
> PostgreSQL 9.0.3 on x86_64-pc-linux-gnu, compiled by GCC gcc-4.4.real
> (Ubuntu 4.4.3-4ubuntu5) 4.4.3, 64-bit
>
> Initially:
>
> VIEW inner := SELECT * FROM complex WHERE filter;
>
> VIEW outer := SELECT * FROM inner JOIN other;
>
>
>
> Now, I discover that the “filter” in the “inner” VIEW is wrong (had
> hard-coded a month/year combination during testing) and so I modified the
> WHERE clause of the “inner” VIEW. I do this using CREATE OR REPLACE VIEW
> inner […]
>
>
>
> Now, I can (SELECT * FROM inner) and I get the expected results.  However,
> if I (SELECT * FROM outer) the query (including the explain), shows me
> original “inner” plan and I thus get – in this case – no results (since the
> hard-coded date does not match my live data).
>
>
>
> Since I did not change the signature of the VIEW the CREATE OR REPLACE
> worked as expected.
>
>
>
> I have pretty good feel for how/why this is happening (though a precise
> explanation is welcomed), and obviously I will need to recreate the
> dependent VIEWs, but I am curious whether any efforts have/are being taken
> to avoid this issue in the future.

One thing that's very important to understand about views in postgres
is that they are *mostly* like SQL macros. The view definition is
simply injected into the outer query so that if you see this problem
using dependent views, you should also see it in a fully expanded
query since that is what postgres does under the hood. Note this is
not necessarily true for other databases (and when it isn't, using
views tends to suck).

I say mostly, because there are a few changes postgres makes when
parsing and storing the SQL behind views for later use. For example,
"select * from foo" is expanded to "select foo.a, foo.b ... from foo"
etc. A simple \d+ on the view should give you the sql as postgres
sees it post storage.

merlin

In response to

Browse pgsql-general by date

  From Date Subject
Next Message Sam Nelson 2011-08-23 22:47:33 JDBC Connection Errors
Previous Message Tom Lane 2011-08-23 21:51:01 Re: View "Caching" - Is this Known and Expected Behavior?