Re: Unions and where optimisation
От | Michael Paesold |
---|---|
Тема | Re: Unions and where optimisation |
Дата | |
Msg-id | 013001c2b72d$658ee4b0$3201a8c0@beeblebrox обсуждение исходный текст |
Ответ на | Unions and where optimisation (Boris Klug <boris.klug@control.de>) |
Ответы |
Re: Unions and where optimisation
|
Список | pgsql-performance |
Boris Klug <boris.klug@control.de> wrote: > > Hannu, does it work? > > Few months ago I lost some time trying to create this kind of query and > > I always got error, that subselect doesn't knows anything about upper > > (outer?) table. > > It does not work on my PostgreSQL 7.2.x > > Get the same error like you: "relation rk does not exist" > > Also the disadvantage of this solution is that the speed up is bound to > queries for the ordernr. If a statement has a where clause e.g. for a > timestamp, the view is still slow. > > Does PostgreSQL not know how to move where clause inside each select in a > union? Hi Boris, As far as I know, this has first been "fixed" in 7.3. I think it was Tom who improved the optimizer to push the where clause into the selects of a union view. I've done a test... create view test as select updated, invoice_id from invoice union all select updated, invoice_id from inv2 union all select updated, invoice_id from inv3; ... and it seems to work (postgresql 7.3 here): billing=# explain select * from test where invoice_id = 111000; QUERY PLAN ---------------------------------------------------------------------------- ---------------- Subquery Scan test (cost=0.00..413.24 rows=114 width=12) -> Append (cost=0.00..413.24 rows=114 width=12) -> Subquery Scan "*SELECT* 1" (cost=0.00..6.00 rows=1 width=12) -> Index Scan using pk_invoice on invoice (cost=0.00..6.00 rows=1 width=12) Index Cond: (invoice_id = 111000) -> Subquery Scan "*SELECT* 2" (cost=0.00..203.62 rows=57 width=12) -> Index Scan using idx_inv2 on inv2 (cost=0.00..203.62 rows=57 width=12) Index Cond: (invoice_id = 111000) -> Subquery Scan "*SELECT* 3" (cost=0.00..203.62 rows=57 width=12) -> Index Scan using idx_inv3 on inv3 (cost=0.00..203.62 rows=57 width=12) Index Cond: (invoice_id = 111000) (11 rows) I hope this is helps. Can you upgrade to 7.3.1? I really think the upgrade is worth the effort. Best Regards, Michael Paesold
В списке pgsql-performance по дате отправления: