Re: To use a VIEW or not to use a View.....

From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: Stephan Szabo <sszabo(at)megazone23(dot)bigpanda(dot)com>
Cc: Tomasz Myrta <jasiek(at)klaster(dot)net>, Jan Wieck <JanWieck(at)Yahoo(dot)com>, Ries van Twisk <ries(at)jongert(dot)nl>, pgsql-sql(at)postgresql(dot)org
Subject: Re: To use a VIEW or not to use a View.....
Date: 2003-01-22 21:35:33
Message-ID: 24368.1043271333@sss.pgh.pa.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-sql

Stephan Szabo <sszabo(at)megazone23(dot)bigpanda(dot)com> writes:
> ... but this is a general transitivity constraint AFAIK, not
> one actually to do with views (ie, if you wrote out the query without a
> view, you can run into the same issue). It's somewhat easier to run into
> the case with views and the effect may be exasperated by views, but it's
> a general condition.

Right. Views are just macros --- they don't in themselves affect the
planner's ability to generate a good plan. But they make it easier to
generate baroque queries without thinking much about what you're doing,
and in complex queries the planner doesn't always make the deductions
and simplifications that are obvious to a human.

> For example:
> create table a(a int);
> create table c(a int);

> sszabo=# explain select * from a join c using (a) where a=3;
> QUERY PLAN
> -------------------------------------------------------------
> Hash Join (cost=1.01..26.08 rows=6 width=8)
> Hash Cond: ("outer".a = "inner".a)
> -> Seq Scan on c (cost=0.00..20.00 rows=1000 width=4)
> -> Hash (cost=1.01..1.01 rows=1 width=4)
> -> Seq Scan on a (cost=0.00..1.01 rows=1 width=4)
> Filter: (a = 3)
> (6 rows)

> The filter is applied only to a. So, if you really wanted the
> c.a=3 condition to be applied for whatever reason you're out of
> luck.

FWIW, CVS tip is brighter: the condition does propagate to both relations.

Hash Join (cost=22.51..45.04 rows=1 width=8)
Hash Cond: ("outer".a = "inner".a)
-> Seq Scan on a (cost=0.00..22.50 rows=5 width=4)
Filter: (a = 3)
-> Hash (cost=22.50..22.50 rows=5 width=4)
-> Seq Scan on c (cost=0.00..22.50 rows=5 width=4)
Filter: (3 = a)

The reason this is useful is that (a) fewer rows need to be joined,
and (b) we may be able to make effective use of indexes on both tables.

regards, tom lane

In response to

Responses

Browse pgsql-sql by date

  From Date Subject
Next Message Björn Metzdorf 2003-01-22 21:43:05 Re: sort by relevance
Previous Message Stephan Szabo 2003-01-22 21:09:14 Re: To use a VIEW or not to use a View.....