Re: Oddity with view (now with test case)

От: Tom Lane
Тема: Re: Oddity with view (now with test case)
Дата: ,
Msg-id: 12776.1226345499@sss.pgh.pa.us
(см: обсуждение, исходный текст)
Ответ на: Re: Oddity with view (now with test case)  (Jim 'Decibel!' Nasby)
Ответы: Re: Oddity with view (now with test case)  (Jim 'Decibel!' Nasby)
Список: pgsql-performance

Скрыть дерево обсуждения

Oddity with view  (Jim 'Decibel!' Nasby, )
 Re: Oddity with view  (Tom Lane, )
  Re: Oddity with view  (Jim 'Decibel!' Nasby, )
   Re: Oddity with view  (Richard Huxton, )
    Re: Oddity with view (now with test case)  (Jim 'Decibel!' Nasby, )
     Re: Oddity with view (now with test case)  (Tom Lane, )
      Re: Oddity with view (now with test case)  (Jim 'Decibel!' Nasby, )
       Re: Oddity with view (now with test case)  (Tom Lane, )
        Re: Oddity with view (now with test case)  (Jim 'Decibel!' Nasby, )
         Re: Oddity with view (now with test case)  (Tom Lane, )
          Re: Oddity with view (now with test case)  (Jim 'Decibel!' Nasby, )
           Re: Oddity with view (now with test case)  (Tom Lane, )
   Re: Oddity with view  (Tom Lane, )

"Jim 'Decibel!' Nasby" <> writes:
> Here's the commands to generate the test case:

> create table a(a int, b text default 'test text');
> create table c(c_id serial primary key, c_text text);
> insert into c(c_text) values('a'),('b'),('c');
> create table b(a int, c_id int references c(c_id));
> create view v as select a, b, null as c_id, null as c_text from a
> union all select a, null, b.c_id, c_text from b join c on (b.c_id=
> c.c_id);
> \timing
> insert into a(a) select generate_series(1,9999999);
> select count(*) from a;
> select count(*) from v;
> explain analyze select count(*) from a;
> explain analyze select count(*) from v;

I think what you're looking at is projection overhead and per-plan-node
overhead (the EXPLAIN ANALYZE in itself contributes quite a lot of the
latter).  One thing you could do is be more careful about making the
union input types match up so that no subquery scan nodes are required:

create view v2 as select a, b, null::int as c_id, null::text as c_text from a
                           
union all select a, null::text, b.c_id, c_text from b join c on (b.c_id=c.c_id);

On my machine this runs about twice as fast as the original view.

            regards, tom lane


В списке pgsql-performance по дате сообщения:

От: Jim 'Decibel!' Nasby
Дата:
Сообщение: Re: Oddity with view (now with test case)
От: Tom Lane
Дата:
Сообщение: Re: Oddity with view (now with test case)