Hello,

if i have the following (simple) table layout:

create table a (
  id serial primary key
);

create table b (
  id integer references a,
  test text
);

create view c as
  select a.id,b.test from a
  left join b
  on a.id = b.id;

So if i do a select * from c i get the following:

test=# EXPLAIN SELECT * from g;
                           QUERY PLAN
----------------------------------------------------------------
 Hash Left Join  (cost=2.45..8.91 rows=8 width=36)
   Hash Cond: ("outer".id = "inner".id)
   ->  Seq Scan on a  (cost=0.00..1.08 rows=8 width=4)
   ->  Hash  (cost=2.16..2.16 rows=116 width=36)
         ->  Seq Scan on b  (cost=0.00..2.16 rows=116 width=36)

and a select id from c executes as

test=# EXPLAIN SELECT id from g;
                          QUERY PLAN
---------------------------------------------------------------
 Hash Left Join  (cost=2.45..7.02 rows=8 width=4)
   Hash Cond: ("outer".id = "inner".id)
   ->  Seq Scan on a  (cost=0.00..1.08 rows=8 width=4)
   ->  Hash  (cost=2.16..2.16 rows=116 width=4)
         ->  Seq Scan on b  (cost=0.00..2.16 rows=116 width=4)

so the only difference is the width estimation.

But why is the scan on table b performed?
If i understand it correctly this is unnecessary because the
result contains only rows from table a.

Is there a way to tell postgres not to do the extra work.
My aim is to speed up lookup to complex joins.

Thanks

Sebastian

---------------------------(end of broadcast)---------------------------
TIP 8: explain analyze is your friend

Reply via email to