It looks pretty much like partitioning. You should check partitioning recipes.
Чт, 21 трав. 2015 06:41 Florian Lohoff <f@xxxxx> пише:
Hi,
i stumbled over something i cant seem to find a workaround. I create a view like
create view v_test as
select a,b
from big_table
union all
select a,b
from small_table;
When i now use the view like
select * from v_test where a = 42;
I can see an index scan happening on big_table. When i issue
something like
select * from v_test where a in ( select 42 );
or joining to another table i see that there will be seq scan on big
table. First the union will be executed and later the filter e.g. a in (
select 42 ) will be done on the huge result. My use case is that
big_table is >70mio entries growing fast and small_table is like 4
entries, growing little. The filter e.g. "a in ( select 42 )" will
typically select 50-1000 entries of the 70mio. So i now create a union
with 70mio + 4 entries to then filter all with a = 42.
It seems the planner is not able to rewrite a union all e.g. the above
statement could be rewritten from:
select *
from (
select a,b
from big_table
union all
select a,b
from small_table;
) foo
where a in ( select 42 );
to
select *
from (
select a,b
from big_table
where a in ( select 42 )
union all
select a,b
from small_table
where a in ( select 42 )
) foo
which would then use an index scan not a seq scan and execution times
would be acceptable.
I have now tried to wrap my head around the problem for 2 days and i am
unable to find a workaround to using a union but the filter optimisation
is impossible with a view construct.
Flo
PS: Postgres 9.1 - I tried 9.4 on Debian/jessie with IIRC same results.
--
Florian Lohoff f@xxxxx
We need to self-defense - GnuPG/PGP enable your email today!