The following bug has been logged on the website: Bug reference: 7785 Logged by: Dag Lem Email address: d...@nimrod.no PostgreSQL version: 9.2.1 Operating system: RedHat EL 5.8 Description:
Hi, The test case below demonstrates that the planner pushes down the WHERE (ON) clause in a UNION ALL view, but fails to push down the WHERE (ON) clause when a JOIN clause is introduced in the view. Any simple fix? :-) Best regards, Dag Lem create table a2 ( pk integer primary key, val2 integer ); create table a1 ( pk integer primary key, val1 integer, pk_a2 integer ); create table b ( pk integer primary key, val1 integer, val2 integer ); create table c ( pk integer ); insert into a2 select generate_series(1,10000), random()*1000; insert into a1 select s, random(), s%20000 from generate_series(1,990000) s; insert into b select generate_series(1100001, 2000000), random()*1000; insert into c select generate_series(980001, 1020000); analyze a1; analyze a2; analyze b; analyze c; create view ab_good as select a1.pk, val1 from a1 union all select pk, val1 from b; create view ab_bad as select a1.pk, val1, val2 from a1 left join a2 on (a2.pk = a1.pk) union all select pk, val1, val2 from b; explain analyze select ab.pk, ab.val1 from c left join ab_good ab on (ab.pk = c.pk); explain analyze select ab.pk, ab.val1, ab.val2 from c left join ab_bad ab on (ab.pk = c.pk); *** ab_good - Good query plan *** QUERY PLAN -------------------------------------------------------------------------------- -------------------------------------------- Nested Loop Left Join (cost=0.00..75682.00 rows=1890000 width=8) (actual time= 0.037..702.184 rows=40000 loops=1) -> Seq Scan on c (cost=0.00..577.00 rows=40000 width=4) (actual time=0.011. .50.068 rows=40000 loops=1) -> Append (cost=0.00..1.86 rows=2 width=8) (actual time=0.010..0.012 rows=0 loops=40000) -> Index Scan using a1_pkey on a1 (cost=0.00..0.98 rows=1 width=8) (a ctual time=0.003..0.004 rows=0 loops=40000) Index Cond: (pk = c.pk) -> Index Scan using b_pkey on b (cost=0.00..0.88 rows=1 width=8) (act ual time=0.003..0.003 rows=0 loops=40000) Index Cond: (pk = c.pk) Total runtime: 750.259 ms (8 rows) *** ab_bad - Bad query plan *** QUERY PLAN -------------------------------------------------------------------------------- --------------------------------------------------------------- Hash Right Join (cost=1077.64..98329.41 rows=1890000 width=12) (actual time=85 58.418..13902.096 rows=40000 loops=1) Hash Cond: (a1.pk = c.pk) -> Append (cost=0.64..50002.41 rows=1890000 width=12) (actual time=0.054..9 710.313 rows=1890000 loops=1) -> Merge Left Join (cost=0.64..27119.41 rows=990000 width=12) (actual time=0.050..4057.602 rows=990000 loops=1) Merge Cond: (a1.pk = a2.pk) -> Index Scan using a1_pkey on a1 (cost=0.00..24278.66 rows=990 000 width=8) (actual time=0.024..1575.131 rows=990000 loops=1) -> Index Scan using a2_pkey on a2 (cost=0.00..240.75 rows=10000 width=8) (actual time=0.015..15.589 rows=10000 loops=1) -> Seq Scan on b (cost=0.00..12983.00 rows=900000 width=12) (actual t ime=0.011..1119.213 rows=900000 loops=1) -> Hash (cost=577.00..577.00 rows=40000 width=4) (actual time=103.728..103. 728 rows=40000 loops=1) Buckets: 4096 Batches: 1 Memory Usage: 1407kB -> Seq Scan on c (cost=0.00..577.00 rows=40000 width=4) (actual time= 0.011..49.449 rows=40000 loops=1) Total runtime: 13950.038 ms (12 rows) -- Sent via pgsql-bugs mailing list (pgsql-bugs@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-bugs