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